Как избавиться от неотслеживаемого статуса подмодулей 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 скрывает эти сообщения; но мне интересно, есть ли способ избавиться от этой грязи более подходящим способом.


person Tomer Lichtash    schedule 26.02.2011    source источник
comment
Этот ответ: stackoverflow.com/a/5127213/199649 вызывает больше возможностей.   -  person charlax    schedule 14.01.2012


Ответы (11)


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

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

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

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

person VonC    schedule 26.02.2011
comment
+1, я был готов кричать, пока не нашел это ... затем понял, что файл .DS_Store был автоматически создан (OS X) в одном из моих подмодулей, что помешало мне зафиксировать основной проект. Арг! Пора обновить _2 _... - person Courtney Christensen; 09.09.2011
comment
Используя Xcode, я также нашел полезным добавить * .xcuserdatad в глобальный файл .gitignore. Это предотвращает попытки git отслеживать локальные настройки Xcode. - person Roy Sharon; 10.10.2011
comment
Если у вас нет прав на отправку подмодуля, вы не сможете поделиться своими изменениями в подмодуле с другими пользователями родительского репо. Решение @quincyglenn, похоже, работает в таком случае. - person Drew Noakes; 01.02.2013
comment
@DrewNoakes Я согласен. Просто я предпочитаю иметь дело с грязными изменениями (добавляя их в .gitignore или добавляя их в систему управления версиями), но не скрывая их с помощью параметра локальной конфигурации. - person VonC; 01.02.2013
comment
@VonC, любой ответ имеет смысл в зависимости от ситуации и предпочтений. Я хотел выделить здесь различие как ссылку на других. Кстати, спасибо за ваши многочисленные ответы о Git здесь, на SO - вы много раз помогали мне. - person Drew Noakes; 01.02.2013
comment
Вы даже можете обойтись без фиксации и создания .gitignore (который сам по себе не отслеживается). Откройте .git/info/exclude подмодуля и добавьте туда строки игнорирования (он работает как .gitignore, но не является частью общего репозитория). - person Martin Pecka; 16.12.2014
comment
@ peci1 хороший момент. Я включил ваш комментарий в ответ для большей наглядности. - person VonC; 16.12.2014
comment
Иногда вы также можете добавить это неотслеживаемое содержимое в глобальный файл gitignore (часто ~/.gitignore-global). Как например .DS_Store или в моем случае Carthage/Build. - person Marián Černý; 18.01.2018

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

[submodule "zen-coding-gedit3"]
    path = zen-coding-gedit3
    url = git://github.com/leafac/zen-coding-gedit3.git
    ignore = dirty
person ezraspectre    schedule 08.09.2012
comment
Мое предпочтительное решение, так как оно легко автоматизируется. - person lethal-guitar; 26.11.2013
comment
Стоит упомянуть, что ignore = untracked также существует и показывает измененные отслеживаемые файлы, но не неотслеживаемые файлы. Было бы неплохо, если бы для всех подмодулей была глобальная настройка ... - person naught101; 27.11.2015
comment
К сожалению, по прошествии почти десяти лет ссылка на сообщение в блоге мертва. :) - person Jesse Adelman; 08.02.2021

Вы также можете перейти в каталог каждого подмодуля и действовать как отдельный 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

после всего

person Ricardo Martins    schedule 04.06.2012
comment
Вероятно, вы не захотите делать git add . без просмотра измененных файлов. В большинстве случаев внесенные изменения - это добавленные .DS_Store файлы - это, вероятно, должно быть обнаружено вашим .gitignore, как упомянул zourtney в первом комментарии к ответу. - person gregoltsov; 25.06.2012
comment
Если вы действительно не хотите обновлять подмодули и хотите вернуться к исходному состоянию, вы можете запустить git submodule update --force. - person Tom; 24.08.2016

Для меня это отлично сработало:

git update-index --skip-worktree <path>

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

person DarkCrazy    schedule 07.09.2018

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

person Browny Lin    schedule 03.11.2013

Вчера я застрял в этой проблеме в проекте, в котором было около 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, который обновил каждый из подмодулей.

person Anshul Goyal    schedule 11.02.2015

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

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

person HappyCoder    schedule 05.08.2015

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

модифицировано: ./../ .. (измененное содержимое, неотслеживаемое содержимое)

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

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

person Subrat Kumar Palhar    schedule 01.02.2019

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

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

person Glenn Lawrence    schedule 08.05.2019

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

person daigo    schedule 09.12.2014

По моему опыту, для MacOS это может появиться из-за того, что были созданы ._ файлы: В этом случае: попробуйте dot_clean .

person Benedikt Wimmer    schedule 03.05.2021