Git: могу ли я запретить перечисление «измененного содержимого» / грязных подмодулей в статусе, разнице и т. Д.? - PullRequest
117 голосов
/ 13 июля 2010

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

$ git status vendor | grep modified:
#       modified:   vendor/rails (modified content)
$ git diff vendor/
diff --git a/vendor/rails b/vendor/rails
--- a/vendor/rails
+++ b/vendor/rails
@@ -1 +1 @@
-Subproject commit 046c900df27994d454b7f906caa0e4226bb42b6f
+Subproject commit 046c900df27994d454b7f906caa0e4226bb42b6f-dirty

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

Edit:

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

Могу ли я положить это в ~/.gitconfig? Из моей первоначальной версии видно, что я не могу, и я не увидел ничего перспективного, просматривая патч. (Я думаю, я все еще могу сделать псевдоним.)

Ответы [ 9 ]

161 голосов
/ 04 апреля 2011

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

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

Суть этого:

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

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

[submodule "bundle/fugitive"]
    path = bundle/fugitive
    url = git://github.com/tpope/vim-fugitive.git
    ignore = dirty
55 голосов
/ 21 сентября 2012

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

Первое - 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
49 голосов
/ 27 июля 2010

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

ignore = dirty

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

С git help status:

--ignore-submodules[=<when>]
    Ignore changes to submodules when looking for changes.
    <when> can be either "untracked", "dirty" or "all", which
    is the default. When "untracked" is used submodules are
    not considered dirty when they only contain untracked
    content (but they are still scanned for modified content).
    Using "dirty" ignores all changes to the work tree of
    submodules, only changes to the commits stored in the
    superproject are shown (this was the behavior before
    1.7.0). Using "all" hides all changes to submodules (and
    suppresses the output of submodule summaries when the
    config option status.submodulesummary is set).

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

git status --ignore-submodules=dirty

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

alias gst='git status --ignore-submodules=dirty'
11 голосов
/ 14 июля 2010

Как вы упомянули, патч подмодуль 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 2.13 (2 квартал 2017 г.) доступен еще один подход для создания состояния git (или любой команды git) для игнорирования определенного подмодуля:

git config submodule.<name>.active false

Подробнее см. " Игнорировать новые коммиты для подмодуля git ".

10 голосов
/ 04 августа 2011

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

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

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

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

6 голосов
/ 28 ноября 2011

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

ignore = dirty

в .gitmodules

2 голосов
/ 14 июля 2010

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

$ git diff --ignore-submodules=dirty vendor
# no output
$ git status --ignore-submodules=dirty vendor
# On branch …
nothing to commit (working directory clean)

Создание собственного 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
1 голос
/ 11 сентября 2018

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

Просто запустите

git config --global diff.ignoreSubmodules dirty

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

1 голос
/ 18 апреля 2016

Возможно, вы не захотите добавлять 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/
...