Как упомянуто в сообщении Марка Лонгаира в Git Submodules Explained ,
Версии 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
git commit -a
выполнить, не беспокоясь о добавлении этих изменений. Хотя они отмеченыM
спереди, они не окажутся в вашем коммите.git clean -id
.git submodule foreach --recursive git clean -id
(сначала для тестирования в резервном репозитории;)).gitignore
. Добавление их туда или в мой глобальный список игнорируемых исправлений.Также удаление субмодуля, а затем запуск
git submodule init
иgit submodule update
, очевидно, сделает свое дело, но не всегда может быть целесообразным или возможным.источник
Чтобы игнорировать все неотслеживаемые файлы в любом подмодуле, используйте следующую команду, чтобы игнорировать эти изменения.
Это добавит следующую конфигурационную опцию в вашу локальную конфигурацию git:
Дополнительную информацию можно найти здесь
источник
РЕДАКТИРОВАТЬ : Этот ответ (и большинство других) устарели; вместо этого посмотрите ответ Девпула .
Первоначально не было опций конфигурации, чтобы сделать "
git diff --ignore-submodules
" и "git status --ignore-submodules
" глобальным значением по умолчанию (но см. Также Установка флагов git default в командах ). Альтернативный вариант - установитьignore
опцию конфигурации по умолчанию для каждого отдельного подмодуля, который вы хотите игнорировать (для обоихgit diff
иgit status
), либо в.git/config
файле (только локальный), либо.gitmodules
(будет создан git). Например:ignore = untracked
игнорировать только неотслеживаемые файлы,ignore = dirty
также игнорировать измененные файлы иignore = all
игнорировать также фиксации. Очевидно, нет способа подстановить его для всех подмодулей.источник
Это так, потому что указатель на субмодуль у вас не тот, который на самом деле находится в каталоге субмодуля. Чтобы это исправить, вы должны
git submodule update
снова запустить :источник
Это не помогло мне, но дало мне список файлов (в моем случае только один), которые были изменены в подмодуле (без того, чтобы я там что-то делал).
Таким образом, я мог перейти к субмодулю, и состояние git показало, что мой HEAD был отсоединен -> мастер git checkout, статус git, чтобы снова увидеть измененный файл, git checkout> filename <, git pull и все снова в порядке.
источник
Я закончил тем, что удалил каталог подмодуля и снова его инициализировал
источник
Подмодуль может быть помечен как грязный, если настройки файлового режима включены, и вы изменили права доступа к файлам в поддереве подмодуля.
Чтобы отключить файловый режим в подмодуле, вы можете отредактировать /.git/modules/path/to/your/submodule/config и добавить
Если вы хотите игнорировать все грязные состояния, вы можете установить
ignore = dirty
свойство в файле /.gitmodules , но я думаю, что лучше отключить только файловый режим.источник
В моем случае я не был уверен, что послужило причиной этого, но я знал, что просто хочу, чтобы субмодули были сброшены до их последней удаленной фиксации и покончили с этим. Это включало объединение ответов на несколько вопросов здесь:
git submodule update --recursive --remote --init
Источники:
Как мне вернуть мои изменения в подмодуль git?
Простой способ получить последние из всех подмодулей git
источник