Игнорировать новые коммиты для подмодуля git
фон
использование Git 1.8.1.1 в Linux. Репозиторий выглядит следующим образом:
master
book
подмодуль был создан следующим образом:
$ cd /path/to/master
$ git submodule add https://user@bitbucket.org/user/repo.git book
на 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-dirty
в файле master/.gitmodules
следующее, Согласно этому ответ:
[submodule "book"]
path = book
url = https://user@bitbucket.org/user/repo.git
ignore = dirty
неудачная попытка #2-untracked
изменить master/.gitmodules
к следующему, согласно этому ответ:
[submodule "book"]
path = book
url = https://user@bitbucket.org/user/repo.git
ignore = untracked
неудачная попытка #3-showUntrackedFiles
редактировать master/.git/config
к следующему, согласно этому ответ:
[status]
showUntrackedFiles = no
неудачная попытка #4 - игнорировать
добавлен каталог книги в главный файл игнорирования:
$ cd /path/to/master/
$ echo book > .gitignore
неудачная попытка #5-clone
добавлен каталог книги к мастеру следующим образом:
$ cd /path/to/master/
$ rm -rf book
$ git clone https://user@bitbucket.org/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://user@bitbucket.org/user/repo.git book
$ git add book
$ echo "book" >> .gitignore
затем совершал.
как указано в связанном git submodule подводные камни статья:
... единственной связью между родителем и подмодулем является [записанное] значение SHA, извлеченного из подмодуля, которое хранится в фиксациях родителя.
это означает, что подмодуль не сохраняется при его извлечении ветвь или тег, но всегда определенной фиксацией; эта фиксация (SHA) сохраняется в супер-РЕПО (тот, который содержит подмодуль), как обычный текстовый файл (он отмечен как такая ссылка, конечно).
когда вы проверяете другую фиксацию в субмодуль или сделайте в нем новую фиксацию, супер-РЕПО увидит, что его проверенный SHA изменился. Вот когда вы получите modified (new commits)
строку с git status
.
чтобы устранить это, вы можете либо:
-
git submodule update
, который сбросит подмодуль до фиксации, сохраненной в настоящее время в супер-РЕПО (Подробнее см. thegit submodule
manpage; или -
git add book && git commit
чтобы сохранить новый SHA в супер-РЕПО.
как упоминалось в комментариях, подумайте об отказе от book
подмодуль: клонируйте его внутри супер-РЕПО, если отслеживание его состояния как части супер-РЕПО не требуется.
просто запустите:
$ git submodule update
это вернет подмодуль к старой фиксации (указанной в parent-repo), без обновления родительского РЕПО с последней версией подмодуля.
есть два вида уведомлений об изменениях, которые вы можете подавить (из git 1.7.2).
первый-это не отслеживаемый контент, который происходит, когда вы вносите изменения в свой подмодуль, но еще не зафиксировали их. Родительский репозиторий замечает это, и git status сообщает об этом соответственно:
modified: book (untracked content)
вы можете подавить их с помощью:
[submodule "book"]
path = modules/media
url = https://user@bitbucket.org/user/repo.git
ignore = dirty
однако после фиксации этих изменений Родительский репозиторий снова обратит на них внимание и сообщит о них соответственно:
modified: book (new commits)
если вы хотите подавить их, вы должны игнорировать все изменения
[submodule "book"]
path = book
url = https://user@bitbucket.org/user/repo.git
ignore = all
Git 2.13 (Q2 2017) добавит еще один способ включить подмодуль, который не должен отслеживаться его родительским РЕПО.
в случае OP:
git config submodule.<name>.active false
посмотреть совершить 1b614c0, совершить 1f8d711, совершить bb62e0a, совершить 3e7eaed, совершить a086f92 (17 марта 2017), и совершить ee92ab9, совершить 25b31f1, совершить e7849a9, совершить 6dc9f01, совершить 5c2bd8b (16 Mar 2017) by Брэндон Уильямс (mbrandonw
).
(слитый Junio C Hamano -- gitster
-- на совершить a93dcb0, 30 марта 2017)
на
submodule
: отделить url и интерес подмодуляsubmodule.<name>.url
параметр config используется для определения данный подмодуль представляет интерес для пользователя. Это кончится громоздко в мире, где мы хотим иметь разные подмодули проверены в разных worktrees или более обобщенный механизм для выбора какие подмодули представляют интерес.в будущем с поддержкой рабочего дерева для подмодулей будет несколько рабочие деревья, для каждого из которых может потребоваться только подмножество подмодулей проверенный.
URL-адрес (где можно получить репозиторий подмодулей) не должен отличаться между различными рабочими деревья.может также быть удобно для потребителей более легко определить группы в составе подмодули, которые их интересуют, в отличие от запуска"
git submodule init <path>
" на каждом подмодуле, который они хотят проверить в своей работе дерево.С этой целью вводятся два параметра конфигурации,
submodule.active
иsubmodule.<name>.active
.
- на
submodule.active
config содержит pathspec, который указывает, какие подмодули должны существовать в рабочем дереве.
- в
submodule.<name>.active
config-это логический флаг, используемый для указания этот конкретный подмодуль должен существовать в рабочем дереве.важно отметить, что
submodule.active
функции по-разному чем другие параметры конфигурации, так как он принимает pathspec.
Это позволяет пользователям принимать по крайней мере два новых рабочих процесса:
- подмодули могут быть сгруппированы с ведущим каталогом, таким образом, что pathspec например'
lib/
' будет охватывать все библиотека-иш модули, чтобы позволить тем, кто заинтересован в библиотеке-иш модули установить"submodule.active = lib/
" только один раз, чтобы сказать все модули в 'lib/
' интересно.- как только функция pathspec-attribute изобретена, пользователи могут помечать подмодули атрибутами для их группировки, так что широкий pathspec с требованиями к атрибутам, например'
:(attr:lib)
', можно использовать для того чтобы сказать все модули с '' интересно.
С , просто нравится the.gitmodules
файл, отслеживается суперпроектом, когда подмодуль перемещается в дереве суперпроекта, проект может настроить, какой путь получает атрибут в.gitattributes
, так же, как он может настроить, какой путь имеет подмодуль в.gitmodules
.
Невик Rehnel ответ будет, безусловно, правильным за то, что вы просите: Я не хотел иметь подмодуль, как, черт возьми, я могу выйти из этой ситуации?!.
только, если требует book
подмодуль, это хороший жест, чтобы сохранить его как таковой, потому что таким образом другие пользователи, которые проверяют ваш проект, могут наслаждаться не имея каких-либо специальных git
команда для запуска (хорошо... есть несколько специальных команд для использования подмодулей, но это все еще проще управлять, в целом, я думаю.)
в вашем случае вы вносите изменения в book
репозитории и в какой-то момент зафиксировать эти изменения. Это означает, что у вас есть новые коммиты в этом подмодуле, которые имеют новую ссылку SHA1.
что вам нужно сделать в главном каталоге, это зафиксировать эти изменения в главном репозитории.
cd /path/to/master
git commit . -m "Update 'book' in master"
это обновит ссылку SHA1 в master
к самой новой версии доступной в book
хранилище. В результате эта фиксация позволяет другим проверять все master
& book
репозитории на кончике.
таким образом, в конечном итоге вы получаете еще одну фиксацию при внесении изменений в подмодуль. Он полупрозрачен, если вы также вносите изменения в некоторые файлы в master
репозиторий, так как вы совершаете оба одновременно.