Git diff говорит, что подпроект грязный - PullRequest
202 голосов
/ 02 февраля 2011

Я только что запустил git diff и получаю следующий вывод для всех моих примерно 10 подмодулей

diff --git a/.vim/bundle/bufexplorer b/.vim/bundle/bufexplorer
--- a/.vim/bundle/bufexplorer
+++ b/.vim/bundle/bufexplorer
@@ -1 +1 @@
-Subproject commit 8c75e65b647238febd0257658b150f717a136359
+Subproject commit 8c75e65b647238febd0257658b150f717a136359-dirty

Что это значит? Как мне это исправить?

Ответы [ 9 ]

242 голосов
/ 02 февраля 2011

Как уже упоминалось в блоге Марка Лонгаира Объяснение подмодулей Git ,

Версии 1.7.0 и более поздних версий git содержат раздражающее изменение в поведении подмодуля git.
Подмодули теперь считаются грязными, если у них есть какие-либо измененные или неотслеживаемые файлы , тогда как ранее это было бы только в том случае, если HEAD в подмодуле указывал на неправильный коммит.

Значение знака плюс (+) в выходных данных подмодуля git изменилось, и в первый раз, когда вы сталкиваетесь с этим, требуется некоторое время, чтобы выяснить, что идет не так, например, просматривая журнал изменений или используя git bisect на git.git, чтобы найти изменения. Пользователям было бы намного приятнее ввести другой символ для «в указанной версии, но грязный».

Вы можете исправить это:

  • передайте или отмените изменения / изменения в каждом из ваших подмодулей, прежде чем вернуться к родительскому репо (где diff больше не должен сообщать о «грязных» файлах). Чтобы отменить все изменения в вашем подмодуле, просто cd в корневой каталог вашего подмодуля и выполните git checkout .

    dotnetCarpenter комментарии , которые вы можете сделать: git submodule foreach --recursive git checkout .

  • или добавьте --ignore-submodules к вашему git diff, чтобы временно игнорировать эти "грязные" подмодули.

Новое в Git версии 1.7.2

Как Noam комментарии ниже , этот вопрос упоминает, что, начиная с git версии 1.7.2, вы можете игнорировать грязные подмодули с помощью:

git status --ignore-submodules=dirty
18 голосов
/ 15 ноября 2012

Также удаление субмодуля и последующий запуск git submodule init и git submodule update, очевидно, помогут, но не всегда могут быть подходящими или возможными.

14 голосов
/ 01 октября 2016

РЕДАКТИРОВАТЬ : Этот ответ (и большинство других) устарели;см. Ответ Devpool вместо .


Изначально не было опций конфигурации, чтобы сделать "git diff --ignore-submodules" и "git status --ignore-submodules" глобальнымиdefault (но см. также Установка флагов git default для команд ).Альтернативой является установка опции конфигурации ignore по умолчанию для каждого отдельного подмодуля, который вы хотите игнорировать (для git diff и git status), либо в файле .git/config (только локальный), либо .gitmodules (будетпо версии Git).Например:

[submodule "foobar"]
    url = git@bitbucket.org:foo/bar.git
    ignore = untracked

ignore = untracked для игнорирования только неотслеживаемых файлов, ignore = dirty для игнорирования измененных файлов и ignore = all для игнорирования также фиксаций.Очевидно, нет способа подстановить его для всех подмодулей.

13 голосов
/ 15 мая 2014

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

8 голосов
/ 06 декабря 2015
git submodule foreach --recursive git checkout .

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

Таким образом, я мог перейти к субмодулю, и состояние git показало, что мой HEAD был отсоединен -> мастер git checkout, статус git, чтобы снова увидеть измененный файл, git checkout> filename <, git pull и все в порядке снова. </p>

6 голосов
/ 11 сентября 2018

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

git config --global diff.ignoreSubmodules dirty

Он добавит следующую конфигурационную опцию в вашу локальную конфигурацию git:

[diff]
  ignoreSubmodules = dirty

Дополнительную информацию можно найти здесь

6 голосов
/ 10 апреля 2017

Я закончил тем, что удалил каталог подмодуля и снова его инициализировал

cd my-submodule
git push
cd ../
rm -rf my-submodule
git submodule init
git submodule update
5 голосов
/ 21 мая 2013

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

Чтобы отключить файловый режим в подмодуле, вы можете редактировать /. Git / modules / path/ to / your / submodule / config и добавьте

[core]
  filemode = false

Если вы хотите игнорировать все грязные состояния, вы можете установить свойство ignore = dirty в /. gitmodules file, но я думаю, что лучше отключить только файловый режим.

0 голосов
/ 30 августа 2017

В моем случае я не был уверен, что послужило причиной этого, но я знал, что просто хочу, чтобы субмодули были сброшены до их последней удаленной фиксации и покончили с этим. Это включало объединение ответов на несколько вопросов здесь:

git submodule update --recursive --remote --init

Источники:

Как мне вернуть мои изменения в подмодуль git?

Простой способ получить последние из всех подмодулей git

...