Как избавиться от статуса Git невосстановленных подмодулей?

Я не могу избавиться от необработанного контента в подмодулях Git. Выполнение git status дает:

# On branch master
# Changes not staged for commit:
#   (use "git add ..." to update what will be committed)
#   (use "git checkout -- ..." to discard changes in working directory)
#   (commit or discard the untracked or modified content in submodules)
#
#    modified:   bundle/snipmate (untracked content)
#    modified:   bundle/surround (untracked content)
#    modified:   bundle/trailing-whitespace (untracked content)
#    modified:   bundle/zencoding (untracked content)
#
no changes added to commit (use "git add" and/or "git commit -a")

Добавление параметра --ignore-submodules скрывает эти сообщения; но я задаюсь вопросом, есть ли способ избавиться от этой грязи в более подходящем, ядро-иш, манере.

Ответ 1

Поскольку состояние git сообщает о неотслеживаемом контенте, фактический способ получить чистый статус состоял бы в том, чтобы войти в каждый из этих подмодулей и:

  • добавить и зафиксировать неотслеживаемое содержимое,
  • или ссылаться на неотслеживаемое содержимое в .gitignore специфичном для каждого модуля.
  • или вы можете добавить то же игнорируемое содержимое в подмодуль .git/info/exclude, что и peci1 в комментариях.
  • или добавить загрязнен спецификации подмодуль, как указано в ezraspectre ответ (upvoted).

    git config -f .gitmodules submodule.<path>.ignore untracked
    
  • или добавьте глобальный файл .gitignore (часто ~/.gitignore-global). Как, например, .DS_Store или в моем случае Carthage/Build чем сообщила Мариан Черны в комментариях. См. .gitginore:

Шаблоны, которые пользователь хочет, чтобы Git игнорировал во всех ситуациях (например, резервные копии или временные файлы, сгенерированные выбранным редактором пользователей), обычно core.excludesFile в файл, указанный в core.excludesFile в ~/.gitconfig. Его значение по умолчанию - $XDG_CONFIG_HOME/git/ignore. Если $XDG_CONFIG_HOME либо не установлен, либо пуст, вместо него используется $HOME/.config/git/ignore.

Ответ 2

Я нашел этот пост в блоге, чтобы работать в целом. Добавив опцию ignore = dirty для каждой записи в файле .gitmodules.

[submodule "zen-coding-gedit3"]
    path = zen-coding-gedit3
    url = git://github.com/leafac/zen-coding-gedit3.git
    ignore = dirty

Ответ 3

Вы также можете перейти к каждому подмодулю и действовать как разделенный git. Например:

cd my/project/submodule
git status

.../получает список измененных файлов /

git add .  //to add all of them to commit into submodule
git commit -m "message to your submodule repo"

вы также можете обновить репозиторий удаленного субмодуля с помощью

git submodule update

в конце концов

Ответ 4

Это будет связано с detached HEAD в вашей субмодульной ветке. Перейдите на ваш путь подмодуля (ex: ./bundle/snipmate), затем git checkout master.

Надеюсь, это поможет:)

Ответ 5

Я застрял в этом вопросе вчера, в проекте, который имел около 12 подмодулей.

git status показывал результат.

# On branch master
# Changes not staged for commit:
#   (use "git add ..." to update what will be committed)
#   (use "git checkout -- ..." to discard changes in working directory)
#   (commit or discard the untracked or modified content in submodules)
#
#   modified:   proj1 (untracked content)
#   modified:   proj1 (modified content, untracked content)
#   ...

Чтобы устранить неподтвержденную ошибку содержимого, мне пришлось удалить необработанные файлы со всех подмодулей (все были *.pyc, *.pyo файлы, сгенерированные python) с помощью .gitignore.

Чтобы решить другое, мне пришлось запустить git submodule update, который обновил каждый из подмодулей.

Ответ 6

В моей ситуации я клонирую модули как отправную точку для нового модуля в среде ZF2. То, что это делает, помещает свою собственную .git-папку в каталог.

Решение в этом случае - удалить папку .git(вам, вероятно, нужно будет отображать скрытые файлы для ее просмотра).

Ответ 7

Это сработало просто отлично для меня:

git update-index --skip-worktree

Если это не работает с путем, попробуйте имя файла. Дайте мне знать, если это сработало и для вас.

До свидания!

Ответ 8

Это, вероятно, происходит, когда у вас есть другой .git [скрытая папка] внутри конкретной папки..

Изменено:./../.. (измененный контент, неотслеживаемый контент)

убедитесь, что ваш подкаталог не содержит эту папку .git.

Если это так, проблему можно решить, удалив папку .git вручную из подкаталога.

Ответ 9

Я предпочитаю использовать SourceTree, поэтому решение для меня было открыть репозиторий подмодулей в SourceTree, который показывает мне список всех неотслеживаемых файлов. Я тогда группа выбрал их все, затем использовал "Удалить".

Я смог это сделать, потому что знал, что все неотслеживаемые файлы на самом деле не нужны.

Ответ 10

Если это временная проблема, вы можете войти в папку подмодуля и запустить git reset HEAD --hard, но вы потеряете все свои изменения внутри подмодуля.