Как заставить git игнорировать изменения в подмодулях по умолчанию

Поскольку модули git были представлены в Git, мне нравится добавлять их так:

[submodule "actionbarsherlock"]
path = actionbarsherlock
url = git://github.com/JakeWharton/ActionBarSherlock.git
ignore = dirty

Важная часть здесь ignore = dirty.

При использовании команды git submodule add я вынужден сам добавить эту строку в файл .gitmodules.

Как я могу сделать это поведением по умолчанию для каждого git submodule add, который я буду делать в будущем?

Я знаю о конфигурации submodule.<name>.ignore, но как применить ее ко всем по умолчанию?


person shkschneider    schedule 31.10.2012    source источник
comment
Не знаю, есть ли способ сделать это по умолчанию, но вы можете легко добавить псевдоним или скрипт, чтобы сделать это за вас.   -  person Christopher    schedule 31.10.2012
comment
Я не понимаю, как это сделать по псевдониму. А что касается скрипта, я просто надеялся, что у git есть опция по умолчанию для него.   -  person shkschneider    schedule 31.10.2012
comment
Git будет рассматривать как псевдоним любой скрипт в $PATH, начинающийся с git-<command>, как git <command>. Вы можете просто написать сценарий оболочки, который принимает имя подмодуля, добавляет его, затем выдает конфигурацию submodule.<name>.ignore и просто называет ее git supersubmodule или что-то в этом роде.   -  person Christopher    schedule 31.10.2012
comment
@Christopher Кристофер, я знаю, что могу это сделать, так что у них действительно нет вариантов git для этого? Пожалуйста, напишите ответ с вашим последним комментарием, если это так.   -  person shkschneider    schedule 31.10.2012


Ответы (5)


Обратите внимание, что даже если бы такая конфигурация была, git 2.0.1 (25 июня 2014 г.) все равно показал бы вам подмодуль, который был подготовлен.

См. коммит 1d2f393 от Йенс Леманн (jlehmann)

В настоящее время установка submodule.<name>.ignore и/или diff.ignoreSubmodules на "all" подавляет весь вывод изменений подмодулей для семейства diff, статуса и фиксации.

Что касается статуса и фиксации, это действительно сбивает с толку, так как даже если пользователь решит записать новую фиксацию для игнорируемого подмодуля, добавив его вручную, это изменение не будет отображаться в списке изменений, подлежащих фиксации.
Чтобы усугубить ситуацию, более поздний «git commit» выдаст ошибку «nothing to commit», если будут подготовлены только игнорируемые подмодули.

Исправьте это, заставив wt_status всегда печатать поэтапные изменения подмодуля, независимо от того, какие параметры игнорирования настроены.
Единственным исключением является случай, когда пользователь явно использует параметр командной строки «--ignore-submodules=all», в этом случае вывод подмодуля по-прежнему подавляется.< br> Это также заставляет "git commit" работать снова, когда только модификации игнорируемых подмодулей находятся в стадии подготовки, так как эта команда использует "фиксируемый" член структуры wt_status, чтобы определить, присутствуют ли поэтапные изменения.

См. также commit c215d3d для части git commit.

person VonC    schedule 27.07.2014
comment
То же самое для git-gui: github.com/git/git/commit/ - person VonC; 02.08.2014

Итак, чтобы закрыть это, нет, для него нет опции по умолчанию (к сожалению).

person shkschneider    schedule 29.11.2012
comment
Это по-прежнему верно для git v2.7.0. - person Alexandre T.; 12.01.2016

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

git config -f .gitmodules submodule.actionbarsherlock.ignore dirty

В моем случае я смог автоматизировать два шага сценария с помощью этой команды.

person Florian Jacob    schedule 02.08.2016

Я не уверен в опции по умолчанию. Если бы это было бинарное состояние (игнорировать или нет), вы могли бы добиться успеха с помощью:

diff.ignoreSubmodules
   Sets the default value of --ignore-submodules. Note that this affects only git diff Porcelain, and not lower level diff commands such as git diff-files.  git checkout also
   honors this setting when reporting uncommitted changes.

Но поскольку вы используете dirty, я не уверен, что есть способ установить значение по умолчанию. В любом случае, вы можете сделать это с псевдонимом git в файле $PATH. Напишите сценарий, который принимает субмодуль в качестве аргумента, и установите правильное значение конфигурации dirty, а затем добавьте этот сценарий в свой файл $PATH. Назовите его git-<command>, и он будет доступен как git <command>.

person Christopher    schedule 31.10.2012
comment
Хорошо, я знаю варианты diff и status, но хотелось бы лучшего. Скрипт - возможный вариант. - person shkschneider; 31.10.2012
comment
Это хороший кандидат в список git. Они могут дать вам определенный ответ, и если этот ответ отрицательный, может быть предложен патч. - person Christopher; 31.10.2012

Вы имеете в виду это?

git config --global core.ignore dirty

который записывает предпочтение в ваш файл ~/.gitconfig.

person brianclements    schedule 18.11.2013
comment
Я не думаю, что это работает. По крайней мере, у меня это не работает (git 1.8.5). - person Paweł Gościcki; 29.11.2013
comment
@brianclements Какая версия поддерживает эту опцию? - person shkschneider; 04.08.2014
comment
Я использую git 1.9.1 на Ubuntu 14.04. Но при втором повторном посещении я думаю, что это тоже не работает для меня. Но опять же, оповещение меня о новых коммитах и ​​неотслеживаемом контенте для моих подмодулей - это поведение, которое я все равно хотел, возможно, я неправильно понял вопрос OP. - person brianclements; 05.08.2014