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

Несколько (вокруг релизов 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? Из моего первоначального показалось, что я не могу, и я не видел ничего перспективного, снимая патч. (Думаю, я все еще могу сделать псевдоним.)

Ответ 1

Обновление: см. (и вверх) 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'

Ответ 2

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

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

Суть его:

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

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

[submodule "bundle/fugitive"]
    path = bundle/fugitive
    url = git://github.com/tpope/vim-fugitive.git
    ignore = dirty

Ответ 3

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

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

modified: modules/media (untracked content)

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

[submodule "modules/media"]
   path = modules/media
   url = [email protected]:user/media.git
   ignore = dirty

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

modified:   modules/media (new commits)

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

[submodule "modules/media"]
   path = modules/media
   url = [email protected]:user/media.git
   ignore = all

Ответ 4

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

Также объявлено в git 1.7.2-rc2 релиз:

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

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

"git status" узнал "--ignore-submodules".

Поэтому, если вы не компилируете самую последнюю версию, у вас не будет этой опции в текущих стабильных версиях.


Относительно этого в качестве опции не совсем выбран метод :

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

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

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

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


Другой способ сделать статус git (или любую команду git) игнорировать определенный подмодуль доступен с помощью git 2.13 (Q2 2017):

git config submodule.<name>.active false

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

Ответ 5

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

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

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

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

Ответ 6

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

ignore = грязный

to.gitmodules

Ответ 7

Итак, 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

Ответ 8

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