Игнорировать новые коммиты для подмодуля 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, который сбросит подмодуль до фиксации, сохраненной в настоящее время в супер-РЕПО (Подробнее см. the git 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.
Это позволяет пользователям принимать по крайней мере два новых рабочих процесса:

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


Run

git submodule update 

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