Задний план
Использование 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
репозитория в репозитории, но при этом git игнорирует book
подмодуль? То есть не должно отображаться следующее:
#
# modified: book (new commits)
#
Как подавить это сообщение при выполнении git status
в главном репозитории?
Статья о ловушках подмодуля git предполагает, что это неправильное использование подмодуля?
источник
git config submodule.<name>.active false
. Смотрите мой ответ нижеОтветы:
Чтобы включить другой репозиторий, который не нужно отслеживать в его супер-репо, попробуйте следующее:
Затем совершите.
Как указано в связанной статье о подводных камнях подмодуля git :
Это означает, что подмодуль сохраняется не его извлеченной веткой или тегом, а всегда определенной фиксацией; этот коммит (SHA) сохраняется в супер-репо (тот, который содержит подмодуль), как обычный текстовый файл (он, конечно, помечен как такая ссылка).
Когда вы проверяете другую фиксацию в подмодуле или делаете новую фиксацию в нем, супер-репо увидит, что его извлеченный SHA изменился. Вот когда получишь
modified (new commits)
линию отgit status
.Чтобы устранить это, вы можете:
git submodule update
, который сбросит подмодуль до фиксации, сохраненной в настоящее время в супер-репо (подробности см. наgit submodule
странице руководства ; илиgit add book && git commit
чтобы сохранить новый SHA в супер-репо.Как упоминалось в комментариях, рассмотрите возможность отказа от
book
подмодуля: клонируйте его внутри супер-репо, если отслеживание его состояния как части супер-репо не требуется.источник
git add book && git commit
. Я не понимал, что git действительно может гарантировать синхронизацию двух репозиториев.Просто беги:
Это вернет подмодуль к старой фиксации (указанной в родительском репо), без обновления родительского репо последней версией подмодуля.
источник
book
хранилища? Я не думаю, что ваш ответ имеет смысл в этом контексте.Есть два типа уведомлений об изменениях, которые вы можете подавить (начиная с git 1.7.2).
Первый - это неотслеживаемый контент, который происходит, когда вы вносите изменения в свой подмодуль, но еще не зафиксировали их. Родительский репозиторий замечает это, и git status сообщает об этом соответственно:
Вы можете подавить их с помощью:
Однако, как только вы зафиксируете эти изменения, родительский репозиторий снова заметит и сообщит о них соответствующим образом:
Если вы хотите подавить и их, вам нужно игнорировать все изменения.
источник
ignore = all
опцию для всех подмодулей. В конце концов, в некоторых модулях были добавлены новые коммиты. Если кто-то затем клонирует супер-репо, будет ли он в старом состоянии подмодулей или он будет проверять самые последние?git clone --recursive git@...
вы получите старое состояние подмодулей. Чтобы обновить их, вам понадобится что-то вродеgit submodule foreach "git pull"
после клонированияignore = all
опция не игнорирует новые коммиты подмодуля. Я использую git версии 1.7.1. Любая идея?Git 2.13 (второй квартал 2017 г.) добавит еще один способ включения подмодуля, который не должен отслеживаться его родительским репо.
В случае OP:
См. Фиксацию 1b614c0 , фиксацию 1f8d711 , фиксацию bb62e0a , фиксацию 3e7eaed , фиксацию a086f92 (17 марта 2017 г.) и фиксацию ee92ab9 , фиксацию 25b31f1 , фиксацию e7849a9 , фиксацию 6dc9f01 , фиксацию 5c2bd8b (16 марта 2017 г.) Брэндона Уильямса (
mbrandonw
) .(Объединено Junio C Hamano -
gitster
- в фиксации a93dcb0 , 30 марта 2017 г.)источник
<name>
вариант для подмодуля в существующем проекте?.git/config
->[submodule "<name>"]
Ответ Невика Ренеля, безусловно, правильный для того, о чем вы спрашиваете: я не хотел иметь подмодуль, как, черт возьми, мне выйти из этой ситуации ?! .
Только, если вашему
master
проекту требуетсяbook
подмодуль, это хороший жест, чтобы сохранить его как таковой, потому что тогда другие пользователи, которые проверяют ваш проект, могут наслаждаться отсутствием какой-либо специальнойgit
команды для запуска (ну ... есть некоторые специальные команды для использования субмодулей, но в целом, я думаю, управлять им все же проще.)В вашем случае вы вносите изменения в
book
репозиторий и в какой-то момент фиксируете эти изменения. Это означает, что у вас есть новые коммиты в этом подмодуле, у которых есть новая ссылка на SHA1.Что вам нужно сделать в главном каталоге, так это зафиксировать эти изменения в главном репозитории.
Это обновит ссылку на SHA1
master
до последней версии, доступной вbook
репозитории. В результате этот коммит позволяет другим проверять все репозиторииmaster
&book
в подсказке.Таким образом, вы получаете еще один коммит всякий раз, когда вносите изменения в подмодуль. Это полупрозрачно, если вы также вносите изменения в некоторые файлы в
master
репозитории, поскольку вы фиксируете оба одновременно.источник
Бежать
на корневом уровне.
источник
git status
говорится. Он по-прежнему считает, что изменения произошли.