Игнорировать новые коммиты для подмодуля git
фон
использование Git 1.8.1.1 на Linux. Репозиторий выглядит следующим образом:
master
book
подмодуль был создан следующим образом:
$ cd /path/to/master
$ git submodule add https://[email protected]/user/repo.git book
The book подмодуль чист:
$ cd /path/to/master/book/
$ git status
# On branch master
nothing to commit, working directory clean
мастер, с другой стороны, показывает, что есть "новые коммиты" для подмодуля книги:
$ cd /path/to/master/
$ git status
# On branch master
# Changes not staged for commit:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: book (new commits)
#
no changes added to commit (use "git add" and/or "git commit -a")
Git должен полностью игнорировать каталог подмодулей, так что мастер также чистый:
$ cd /path/to/master/
$ git status
# On branch master
nothing to commit, working directory clean
неудачная попытка #1 - грязный
в файле master/.gitmodules является следующим, согласно этому ответу:
[submodule "book"]
path = book
url = https://[email protected]/user/repo.git
ignore = dirty
неудачная попытка #2-untracked
изменить master/.gitmodules к следующему, согласно этому ответу:
[submodule "book"]
path = book
url = https://[email protected]/user/repo.git
ignore = untracked
неудачная попытка #3-showUntrackedFiles
редактировать master/.git/config к следующему, согласно этому ответу:
[status]
showUntrackedFiles = no
Неудачная Попытка #4 - игнорировать
добавлен каталог книги в главный файл игнорирования:
$ cd /path/to/master/
$ echo book > .gitignore
неудачная попытка #5 - клон
добавил каталог книг к мастеру следующим образом:
$ cd /path/to/master/
$ rm -rf book
$ git clone https://[email protected]/user/repo.git book
вопрос
как book подмодуль находится в собственном каталоге репозитория под master репозиторий еще есть git игнорировать book субмодуль? То есть, следующее не должно отображаться:
#
# modified: book (new commits)
#
как подавить это сообщение при выполнении git status в главном репозитории?
статьи о подводные камни подмодуля git предполагает, что это неуместное использование подмодуля?
6 ответов:
чтобы включить другой репозиторий, который не нужно отслеживать в его супер-РЕПО, попробуйте следующее:
$ cd /path/to/master/ $ rm -rf book $ git clone https://[email protected]/user/repo.git book $ git add book $ echo "book" >> .gitignoreзатем совершал.
как указано в ссылке git подмодуль подводные камни статья:
... единственная связь между родителем и подмодулем-это [записанное] значение извлеченного SHA подмодуля, которое хранится в фиксации родителя.
это означает, что подмодуль не сохраняется при его извлечении ветвь или тег, но всегда с помощью определенной фиксации; эта фиксация (SHA) сохраняется в супер-РЕПО (тот, который содержит подмодуль), как обычный текстовый файл (он помечен как такая ссылка, конечно).
когда вы проверяете другую фиксацию в субмодуль или сделайте новый коммит в нем, супер-РЕПО увидит, что его проверенный SHA изменился. Вот когда вы получите
modified (new commits)строку сgit status.чтобы устранить это, вы можете либо:
git submodule update, который сбросит подмодуль на фиксацию, сохраненную в настоящее время в супер-РЕПО (Подробнее см. thegit submodulemanpage; илиgit add book && git commitчтобы сохранить новый SHA в супер-РЕПО.как уже упоминалось в комментариях, рассмотрите возможность отказа от
bookподмодуль: клонируйте его внутри супер-РЕПО, если отслеживание его состояния как части супер-РЕПО не требуется.
просто запустите:
$ git submodule updateэто приведет к возврату подмодуля к старой фиксации (указанной в Родительском репо), без обновления родительского РЕПО с последней версией подмодуля.
существует два вида уведомлений об изменениях, которые вы можете подавить (из git 1.7.2).
первый-это неотслеживаемый контент, который происходит, когда вы вносите изменения в свой подмодуль, но еще не зафиксировали их. Родительский репозиторий замечает это, и git status сообщает об этом соответственно:
modified: book (untracked content)вы можете подавить их с помощью:
[submodule "book"] path = modules/media url = https://[email protected]/user/repo.git ignore = dirtyоднако, как только вы зафиксируете эти изменения, Родительский репозиторий снова заметит и сообщит о них соответственно:
modified: book (new commits)если вы хотите подавить их, вы должны игнорировать все изменения
[submodule "book"] path = book url = https://[email protected]/user/repo.git ignore = all
Git 2.13 (Q2 2017) добавит еще один способ включить подмодуль, который не должен отслеживаться его родительским РЕПО.
в случае ОП:
git config submodule.<name>.active falseпосмотреть commit 1b614c0,commit 1f8d711,commit bb62e0a,совершить 3e7eaed,commit a086f92 (17 марта 2017), и commit ee92ab9,совершить 25b31f1,commit e7849a9, commit 6dc9f01,commit 5c2bd8b (16 марта 2017) by Брэндон Уильямс (
mbrandonw).
(слитый Junio C Hamano--gitster-- на commit a93dcb0, 30 марта 2017)на
submodule: отделить url и интерес подмодуляsubmodule.<name>.urlпараметр конфигурации используется для определения, если данный подмодуль представляет интерес для пользователя. Это кончится громоздко в мире, где мы хотим иметь разные подмодули проверены вне в различных worktrees или более обобщенном механизме для того чтобы выбрать какие подмодули представляют интерес.в будущем с поддержкой рабочего дерева для подмодулей будет несколько рабочие деревья, каждому из которых может понадобиться только подмножество подмодулей проверенный.
URL-адрес (где может быть получен репозиторий подмодулей) не должен отличаться между различными рабочими деревья.может также быть удобно для потребителей более легко определить группы в составе подмодули, которые их интересуют, в отличие от запуска"
git submodule init <path>" на каждом подмодуле они хотят проверить в своей работе дерево.для этого вводятся два варианта конфигурации,
submodule.activeиsubmodule.<name>.active.
- The
submodule.activeconfig содержит pathspec, который указывает, какие подмодули должны существовать в рабочем дереве.
- в
submodule.<name>.activeconfig-это логический флаг, используемый, чтобы указать, если этот конкретный подмодуль должен существовать в рабочем дереве.важно отметить, что
submodule.activeфункции по-разному чем другие параметры конфигурации, так как он принимает pathspec.
Это позволяет пользователям принять по крайней мере два новых рабочих процесса:
- подмодули могут быть сгруппированы с ведущим каталогом, таким что pathspec например'
lib/' будет охватывать все библиотека-ish модули, чтобы позволить тем, кто заинтересован в библиотеке-ish модули, чтобы установить "submodule.active = lib/" только один раз, чтобы сказать любые и все модули в 'lib/' интересно.- после того, как функция pathspec-attribute будет изобретена, пользователи могут помечать подмодули атрибутами для их группировки, так что широкий pathspec с требованиями атрибутов, например'
:(attr:lib)', можно использовать для того чтобы сказать все и все модули с '' интересно.
Так как , просто нравится элемент.gitmodulesфайл, отслеживается суперпроектом, когда подмодуль перемещается в дереве суперпроекта, проект может настроить, какой путь получает атрибут в.gitattributes, так же, как он может настроить, какой путь имеет подмодуль в.gitmodules.
ответ Невика Ренеля, безусловно, правильный для того, что вы спрашиваете: Я не хотел иметь подмодуль, как, черт возьми, я могу выйти из этой ситуации?!.
только, если требует
bookподмодуль, это хороший жест, чтобы сохранить его как таковой, потому что таким образом другие пользователи, которые проверяют ваш проект, могут наслаждаться тем, что у них нет никаких специальныхgitкоманда для запуска (ну... есть некоторые специальные команды для использования подмодулей, но все равно проще управлять, в целом, я думаю.)в вашем случае вы вносите изменения в
bookрепозитории и в какой-то момент зафиксировать эти изменения. Это означает, что у вас есть новые коммиты в этом подмодуле, которые имеют новую ссылку SHA1.то, что вам нужно сделать в главном каталоге, - это зафиксировать эти изменения в главном репозитории.
cd /path/to/master git commit . -m "Update 'book' in master"это обновит ссылку SHA1 в
masterдо последней версии, доступной вbookхранилище. В результате эта фиксация позволяет другим проверять всеmaster&bookрепозитории на кончике.таким образом, в конечном итоге вы получаете еще одну фиксацию всякий раз, когда вы вносите изменения в подмодуль. Он полупрозрачен, если вы также вносите изменения в некоторые файлы в
masterрепозиторий, так как вы бы совершать одновременно.
Comments