Несколько (вокруг релизов 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 = git@github.com:user/media.git
ignore = dirty
Однако после того, как вы зафиксируете эти изменения, родительский репозиторий снова примет к сведению и сообщит об этом соответствующим образом:
modified: modules/media (new commits)
Если вы тоже хотите их подавить, вам нужно игнорировать all
changes
[submodule "modules/media"]
path = modules/media
url = git@github.com: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/