Игнорировать новые коммиты для подмодуля 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 - грязный
Внутри файла master/.gitmodules
является следующим, согласно этому ответу:
[submodule "book"]
path = book
url = https://user@bitbucket.org/user/repo.git
ignore = dirty
Неудачная попытка № 2 - неотслеживаемая
Изменено 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 - клон
Добавил каталог книг к мастеру следующим образом:
$ cd /path/to/master/
$ rm -rf book
$ git clone https://user@bitbucket.org/user/repo.git book
Вопрос
Как можно book
субмодуль находиться в своем собственном каталоге хранилища под master
хранилище еще есть мерзавец игнорировать 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
, который сбросит субмодуль к коммиту, сохраненному в данный момент в супер-репо (подробности см. вgit submodule
man-страница; или же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) добавит еще один способ включения подмодуля, который не должен отслеживаться его родительским репо.
В случае ОП:
git config submodule.<name>.active false
См. Коммит 1b614c0, коммит 1f8d711, коммит bb62e0a, коммит 3e7eaed, коммит a086f92 (17 марта 2017 г.) и коммит ee92ab9, коммит 25b31f1, коммит e7849a9, коммит 6dc9f01, коммит 5c2bd8b (16 мар 2017 г.) от Brandon Williams ( mbrandonw
)
(Объединено Юнио С Хамано - gitster
- в коммите a93dcb0, 30 марта 2017 г.)
submodule
: разделить URL и субмодульный интересВ настоящее время
submodule.<name>.url
Параметр config используется для определения того, представляет ли данный подмодуль интерес для пользователя. Это становится громоздким в мире, где мы хотим, чтобы различные подмодули были проверены на разных рабочих деревьях, или более обобщенный механизм выбора подмодулей, представляющих интерес.В будущем с поддержкой рабочих модулей для подмодулей будет несколько рабочих деревьев, каждое из которых может нуждаться только в проверке подмножества подмодулей.
URL (где можно получить репозиторий подмодулей) не должен различаться в разных рабочих деревьях.Пользователям также может быть удобнее указать группы подмодулей, которые им интересны, а не запускать ".
git submodule init <path>
"на каждом подмодуле они хотят проверить в своем рабочем дереве.Для этого введены два варианта конфигурации,
submodule.active
а такжеsubmodule.<name>.active
,
submodule.active
config содержит спецификацию пути, которая указывает, какие подмодули должны существовать в рабочем дереве.
submodule.<name>.active
config - логический флаг, используемый для указания того, должен ли этот конкретный подмодуль существовать в рабочем дереве.Важно отметить, что
submodule.active
функционирует иначе, чем другие параметры конфигурации, так как он принимает спецификацию пути.
Это позволяет пользователям принять как минимум два новых рабочих процесса:
- Подмодули могут быть сгруппированы с ведущим каталогом, например, с указанием пути, например:
lib/
"охватит все модули library-ish, чтобы позволить установить те, кто интересуется модулями library-ish"submodule.active = lib/
"Один раз, чтобы сказать все модули вlib/
интересны.- После того, как особенность атрибута pathspec придумана, пользователи могут пометить подмодули с атрибутами, чтобы сгруппировать их так, чтобы широкая спецификация пути с требованиями к атрибутам, например
:(attr:lib)
', может использоваться, чтобы сказать любой и все модули с'lib
Атрибут интересный.
Так как.gitattributes
файл, как и.gitmodules
файл, отслеживается суперпроектом, когда подмодуль перемещается в дереве суперпроекта, проект может настроить, какой путь получает атрибут в.gitattributes
так же, как он может настроить, какой путь имеет подмодуль в.gitmodules
,
Ответ Невика Рехнела, безусловно, правильный для того, что вы спрашиваете: я не хотел иметь подмодуль, какого черта я выхожу из этой ситуации?!,
Только если ваш master
Проект требует book
Подмодуль, это хороший жест, чтобы сохранить его таким, потому что таким образом другие пользователи, которые проверяют ваш проект, могут наслаждаться отсутствием каких-либо специальных git
команда для запуска (ну... есть некоторые специальные команды для использования подмодулей, но управлять ими в целом все же проще, я думаю.)
В вашем случае вы вносите изменения в book
хранилище и в какой-то момент вы совершаете эти изменения. Это означает, что у вас есть новые коммиты в этом подмодуле, которые имеют новую ссылку SHA1.
Что вам нужно сделать в главном каталоге - это зафиксировать эти изменения в главном репозитории.
cd /path/to/master
git commit . -m "Update 'book' in master"
Это обновит ссылку SHA1 в master
до новейшей версии, доступной в book
репозиторий. В результате этот коммит позволяет другим пользователям оформить все master
& book
хранилища на кончике.
Таким образом, в результате вы получаете еще один коммит, когда вносите изменения в подмодуль. Он полупрозрачен, если вы также вносите изменения в некоторые файлы в master
хранилище, так как вы совершите оба одновременно.