Git: могу ли я запретить перечисление "измененного содержимого" / грязных подмодулей в статусе, разнице и т. Д.?
Когда-то (примерно в версиях 1.6.x, я думаю) git узнал об изменениях внутри подмодулей. Это только раздражает меня
$ git status vendor | измененный grep: # Изменено: vendor/rails (изменено содержимое)
$ git diff vendor / diff - git a / vendor / rails b / vendor / rails --- а / продавец / рельсы +++ b/vendor/rails @@ -1 +1 @@ -Подпроект коммит 046c900df27994d454b7f906caa0e4226bb42b6f + Подпроект коммит 046c900df27994d454b7f906caa0e4226bb42b6f-dirty
Пожалуйста, остановите это?
Редактировать:
Итак, у меня есть ответ. Теперь у меня есть еще один вопрос:
Могу ли я положить это в ~/.gitconfig
? Из моей первоначальной версии видно, что я не могу, и я не увидел ничего перспективного, просматривая патч. (Я думаю, я все еще могу сделать псевдоним.)
9 ответов
Обновление: см. (И upvote) NilsHaldenwang относительно возможности добавить к .gitmodules
подайте параметр конфигурации для игнорирования грязного состояния данного подмодуля.
ignore = dirty
Итак, git 1.7.2 вышел и включает --ignore-submodules
вариант для status
,
От git help status
:
--ignore-submodules [=] Игнорировать изменения в подмодулях при поиске изменений. может быть "unraracked", "dirty" или "all", что является значением по умолчанию. Когда используется "неотслеживаемый", подмодули не считаются грязными, если они содержат только неотслеживаемый контент (но они все еще сканируются на наличие модифицированного контента). Использование "грязного" игнорирует все изменения в рабочем дереве подмодулей, отображаются только изменения в коммитах, хранящихся в суперпроекте (это было поведение до 1.7.0). Использование "all" скрывает все изменения подмодулей (и подавляет вывод сводок подмодулей, когда установлена опция config status.submodulesummary).
Значение, которое я хочу, это dirty
,
git status --ignore-submodules=dirty
Я использую псевдоним, потому что я ленивый:
alias gst='git status --ignore-submodules=dirty'
Существует даже возможность установить режим игнорирования для каждого добавленного подмодуля в файле.gitmodules.
Только сегодня я столкнулся с этой проблемой и сразу же написал статью в своем блоге об этом после нахождения решения: Как игнорировать изменения в подмодулях git
Суть этого:
После добавления субмодуля появится файл с именем
.gitmodules
в корне вашего хранилища
Просто добавьте одну строку к этому .gitmodules
файл:
[submodule "bundle/fugitive"]
path = bundle/fugitive
url = git://github.com/tpope/vim-fugitive.git
ignore = dirty
Существует два вида уведомлений об изменениях, которые вы можете отменить.
Первый 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
Как вы упоминаете, подмодуль 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 (или любой команды git) для игнорирования определенного подмодуля доступен в Git 2.13 (Q2 2017):
git config submodule.<name>.active false
Смотрите больше в " Игнорировать новые коммиты для подмодуля git ".
Вы также можете использовать
% git config [--global] submodule.ignore dirty
установить submodule.ignore = dirty
в вашем .git/config
файл. --global
установит флаг игнорирования в вашем ~/.gitconfig
и применить ко всем вашим репозиториям. Без этого он должен установить в .git/config
только для репо, в котором вы сейчас находитесь.
Единственная документация, которую я могу найти на это submodule.<name>.ignore
в документации по git-config. Я переместил его из файла.gitmodules в мой ~/.gitconfig, и он все еще работает для меня.
Я ответил на этот вопрос здесь более подробно.
Просто беги
git config --global diff.ignoreSubmodules dirty
добавить опцию локальной конфигурации, чтобы игнорировать эти изменения.
Итак, 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
Вы можете не захотеть добавлять 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/