Игнорировать новые коммиты для подмодуля 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 предполагает, что это неуместное использование подмодуля?

836   6  

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, который сбросит подмодуль на фиксацию, сохраненную в настоящее время в супер-РЕПО (Подробнее см. the git submodule manpage; или
  • 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.active config содержит pathspec, который указывает, какие подмодули должны существовать в рабочем дереве.
    • в submodule.<name>.active config-это логический флаг, используемый, чтобы указать, если этот конкретный подмодуль должен существовать в рабочем дереве.

важно отметить, что submodule.active функции по-разному чем другие параметры конфигурации, так как он принимает pathspec.
Это позволяет пользователям принять по крайней мере два новых рабочих процесса:

  1. подмодули могут быть сгруппированы с ведущим каталогом, таким что pathspec например'lib/' будет охватывать все библиотека-ish модули, чтобы позволить тем, кто заинтересован в библиотеке-ish модули, чтобы установить "submodule.active = lib/ " только один раз, чтобы сказать любые и все модули в 'lib/' интересно.
  2. после того, как функция 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 репозиторий, так как вы бы совершать одновременно.

Run

git submodule update 

на корневом уровне.

Comments

    Ничего не найдено.