Git: могу ли я подавить перечисление записей «измененного содержимого» / грязного подмодуля в статусе, различиях и т.д.?

123

Когда-то (я думаю, примерно в версиях 1.6.x) git узнал об изменениях внутри подмодулей. Это меня только раздражает:

Поставщик статуса $ git | grep изменен:
# modified: vendor / rails (измененное содержимое)
$ git diff vendor /
diff --git a / vendor / rails b / vendor / rails
--- a / vendor / rails
+++ b / vendor / рельсы
@@ -1 +1 @@
-Подпроект коммит 046c900df27994d454b7f906caa0e4226bb42b6f
+ Подпроект коммит 046c900df27994d454b7f906caa0e4226bb42b6f-dirty

Пожалуйста, останови это?

Редактировать:

Хорошо, у меня есть ответ. Теперь у меня другой вопрос:

Могу я вставить это ~/.gitconfig? Судя по моему первоначальному мнению, я не могу этого сделать, и я не увидел ничего многообещающего, просматривая патч. (Думаю, я еще могу придумать псевдоним.)

KCH
источник
Я вижу некоторые исправления в списке рассылки git, датированные июнем 2010 года. Надеюсь, они будут в следующем выпуске. (google for 'git "--ignore-submodules = dirty"')
kch
+1 за объяснение, почему появляется сообщение!
dotancohen 05

Ответы:

175

Существует даже возможность установить режим игнорирования для каждого добавленного подмодуля в файле .gitmodules.

Как раз сегодня я столкнулся с этой проблемой и сразу же после того, как нашел решение, написал об этом статью в своем блоге: Как игнорировать изменения в подмодулях git

Суть его:

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

Просто добавьте в этот .gitmodulesфайл одну строчку :

[submodule "bundle/fugitive"]
    path = bundle/fugitive
    url = git://github.com/tpope/vim-fugitive.git
    ignore = dirty
NilsHaldenwang
источник
5
+1, но я включил основную часть вашего сообщения в блоге в ваш ответ на SO: ваша внешняя ссылка может стать недействительной однажды, в отличие от ответов SO, которые будут жить вечно (через дампы SO: blog.stackoverflow.com/2009/ 06 /… )
VonC
5
Я обнаружил, что мне нужно зафиксировать файл .gitmodules, прежде чем он заработает должным образом git status. Также вам нужно как минимум 1.7.4 или лучше.
aleemb
Для .gitignoreфайла существует частная версия с именем exclude, расположенная в .git/info/, которая не обрабатывается версиями. Есть ли соответствующий файл для .gitmodulesфайла, который позволит вам подавлять изменения в подмодуле только в вашем экземпляре родительского репозитория, не внося изменений в .gitmodules?
HelloGoodbye
2
Я не могу заставить это работать с подмодулем, отслеживающим ветку. Разве для этого не поддерживается? `` `[подмодуль" smstack / ansible / hosts "] path = smstack / ansible / hosts url = https: // ... branch = master ignore = dirty` `` ``
Марк Абрамовиц
1
@MarcAbramowitz Я столкнулся с той же проблемой, я думаю - вы нашли какое-либо решение?
Себастьян Г. Маринеску
61

Есть два типа уведомлений об изменениях, которые вы можете подавить.

Первое untracked contentпроисходит, когда вы вносите изменения в свой подмодуль, но еще не зафиксировали их. Родительский репозиторий замечает это и git statusсообщает об этом соответственно:

modified: modules/media (untracked content)

Вы можете подавить их с помощью:

[submodule "modules/media"]
   path = modules/media
   url = git@github.com:user/media.git
   ignore = dirty

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

modified:   modules/media (new commits)

Если вы хотите подавить и это, вам нужно игнорировать allизменения

[submodule "modules/media"]
   path = modules/media
   url = git@github.com:user/media.git
   ignore = all
aleemb
источник
2
Для .gitignoreфайла существует частная версия с именем exclude, расположенная в .git/info/, которая не обрабатывается версиями. Есть ли соответствующий файл для .gitmodulesфайла, который позволит вам подавлять изменения в подмодуле только в вашем экземпляре родительского репозитория, не внося изменений в .gitmodules?
HelloGoodbye
1
Привет, до свидания: если вы проверите .git / modules / $ MODULENAME /, вы увидите, что похоже на каталог .git для этого модуля. Изменение файла информации / исключения в этом месте выполняет свою работу.
PaulW
1
ignore = allЧасть полезна.
Эрик Ван
53

Обновление: См (и upvote) nilshaldenwang «s ответ о возможности добавить в .gitmodulesфайл конфигурации параметр для игнорирования грязного состояния данного субмодуля.

ignore = dirty

Итак, git 1.7.2 отсутствует и включает --ignore-submodulesопцию для status.

Откуда git help status:

--ignore-подмодули [= <при>]
    При поиске изменений игнорируйте изменения в подмодулях.
    <when> может быть "неотслеживаемым", "грязным" или "все", что
    по умолчанию. Когда используется "неотслеживаемый", субмодули
    не считаются грязными, если они содержат только неотслеживаемые
    контент (но они по-прежнему сканируются на наличие измененного содержимого).
    Использование "dirty" игнорирует все изменения в дереве работы
    подмодули, изменения только в коммитах, хранящихся в
    показаны суперпроекты (так было до
    1.7.0). Использование "all" скрывает все изменения в подмодулях (и
    подавляет вывод сводок подмодулей, когда
    установлена ​​опция config status.submodulesummary).

Значение, которое я хочу dirty.

git status --ignore-submodules=dirty

Я использую псевдоним, потому что мне лень:

alias gst='git status --ignore-submodules=dirty'
KCH
источник
2
Поскольку это принятый ответ, я думаю, вам также следует добавить сюда возможность добавления ignore=dirtyотдельных записей в .gitmodulesфайл.
Андрей Дроздюк
14

Как вы упомянули, подмодуль patch git: игнорировать грязные подмодули для сводки и статуса находится в стадии разработки.

Также объявлено в выпуске Git 1.7.2-rc2 :

Git v1.7.2 Release Notes (draft)
================================

Updates since v1.7.1
--------------------

« git status» Научились « --ignore-submodules» вариант.

Смысл:

git config --global diff.ignoreSubmodules dirty

Относительно этого варианта сейчас не совсем тот подход :

После этой серии я планирую добавить параметр конфигурации ' ignore' .gitmodules, который может быть установлен для каждого подмодуля на "все", "грязный", "неотслеживаемый" или "нет" (по умолчанию).

" git diff" и " git status" будут использовать это значение конфигурации для каждого подмодуля.
Использование " --ignore-submodule" отменяет это значение по умолчанию (и новый параметр "none" будет добавлен туда, чтобы иметь возможность переопределить настройки конфигурации).

И чтобы не делать " git submdule sync" каждый раз, когда эта опция изменяется, я хотел бы .git/configсначала искать ее .
Если его там нет, то он будет взят .gitmodules, если он есть.

Таким образом, пользователи могут переопределить настройку, но если они этого не сделают, восходящий поток может легко изменить ее (например, когда подмодули .gitignoreбыли обновлены так, что " ignore=untracked" больше не требуется, его можно удалить).
Также переключение ветвей будет иметь эффект мгновенно, если ignoreзапись в .gitmodulesразных ветвях будет разной.


Другой подход, позволяющий сделать git status (или любую команду git) игнорированием определенного подмодуля, доступен в Git 2.13 (второй квартал 2017 г.):

git config submodule.<name>.active false

См. Больше в « Игнорировать новые коммиты для подмодуля git ».

VonC
источник
Я обновил вопрос с помощью бит gitconfig. Просто пинг на случай, если вы знаете ответ.
kch
@kch: Я обновил ответ с учетом подхода, предлагаемого в настоящее время для хранения таких настроек.
VonC
@drozzy: как вы упомянули в своем другом комментарии: " ignore = dirty"
VonC
1
@drozzy: Я поддержал и завершил ответ nilshaldenwang с дополнительным параметром конфигурации "ignore = dirty", я отредактировал официальный ответ, добавив ссылку на сообщение nilshaldenwang.
VonC
Спасибо, ничего личного, но я просто хотел получить более полезный ответ вверху, который я сначала пропустил!
Андрей Дроздюк
11

Вы также можете использовать

% git config [--global] submodule.ignore dirty

установить submodule.ignore = dirtyв вашем .git/configфайле. --globalустановит флаг игнорирования в вашем ~/.gitconfigи применит ко всем вашим репозиториям. Без него он должен быть установлен .git/configтолько для репо, в котором вы сейчас находитесь.

Единственная документация, которую я могу найти по этому submodule.<name>.ignoreповоду, находится в документации git-config . Я переместил его из файла .gitmodules в свой ~ / .gitconfig, и он все еще у меня работает.

kjell_
источник
@ PawełGościcki Я могу подтвердить, что он работает на Git 2.0.0.
Чиро Сантилли 郝海东 冠状 病 六四 事件 法轮功
6

Вам нужно добавить

игнорировать = грязный

в .gitmodules

Римский
источник
Куда в .gitmodules вы его добавляете?
Андрей Дроздюк
@drozzy Вы добавляете его в раздел для каждого подмодуля, который вы хотите игнорировать, где определены значения «path» и «url».
jsdalton
2

Итак, git v1.7.2-rc2 имеет то, что я хочу:

$ git diff --ignore-submodules = грязный поставщик
# нет вывода
$ git status --ignore-submodules = грязный поставщик
# В ветке…
ничего не фиксировать (рабочий каталог чист)

Создание собственного git howto:

# get git
git clone git://git.kernel.org/pub/scm/git/git.git git
cd git
git checkout v1.7.2-rc2

# make git. beware of setting prefix
make configure
./configure --prefix=/usr/local
make
sudo make install

# you REALLY don't want to `make doc`, use this instead
sudo make quick-install-man
sudo make quick-install-html
KCH
источник
1
Я отсчитать семь мерзавцев здесь: git clone git://git.kernel.org/pub/scm/git/git.git git.
dotancohen 05
2

Я ответил на этот вопрос здесь более подробно.

Просто беги

git config --global diff.ignoreSubmodules dirty

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

Devpool
источник
1

Возможно, вы не захотите добавлять ignore = dirtyчто-либо .gitmodules, вы можете более избирательно подходить к изменениям, которые вы хотите игнорировать.

Для этого добавьте шаблоны в .git/submodule_foo/bar/info/exclude, где submodule_foo/bar/путь к подмодулю.

Шаблоны похожи на шаблоны, которые вы бы добавили .gitignore, причем корнем является каталог подмодуля. Например, этот шаблон игнорирует buildкаталог в подмодуле submodule_foo/bar/:

# in .git/submodule_foo/bar/info/exclude:
/build/
Флимм
источник
3
Я думаю, что это также скроет изменения внутри подмодуля. Я хочу, чтобы изменения были скрыты только за пределами подмодуля. Ничего страшного, если они появятся внутри, когда я активно работаю над подмодулем.
Рафаэль Швейкерт