Я также согласен с ответом Рональда Уильяма . Основная цель подмодулей Git - обновление кода, взятого из внешнего мира, без необходимости фиксировать изменения, если этот код был изменен обновлением.
Система управления пакетами Composer делает то же самое. На самом деле они не рекомендуют фиксировать эти изменения либо и игнорируют папку vendor в .gitignore в корне проекта.
Это кошмар, если вы попытаетесь зафиксировать эту папку, потому что некоторые из vendor / some_repo могут иметь версию для разработки, и, следовательно, у них есть папка .git, которая приводит ко всем этим пакетам. стать подмодулями, даже если вы не добавите их с помощью git submodule add
. Вы можете увидеть что-то подобное, если вы измените some_file
во вложенном репозитории .git:
~/project_root $ 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)
# (commit or discard the untracked or modified content in submodules)
#
# modified: vendor/nested_repo (modified content)
Обратите внимание на измененное содержимое в подмодулях , и вы не увидите имя some_file
в выходных данных. Вместо этого вы видите уведомление (измененное содержимое) , поскольку root_project .git видит vendor / nested_repo как подмодуль и не отслеживает отдельные файлы в этой папке.
Если вы запустите git add --all
, вы не получите никакого результата, пока не внесете изменения в vendor/nested_repo
, и только после этого вы сможете зафиксировать изменения в корневом хранилище.
Не делай этого. Вместо этого, если вы хотите сохранить свой проект в качестве целого репозитория .git (любого, не только репозитория, созданного в Composer), что иногда очень удобно, добавьте эту запись в корневой каталог .gitignore BEFORE начальная фиксация:
.git
!/.git
К сожалению, чтобы весь рецепт работал, вам нужно запустить команду git add
для каждого из вложенных репозиториев, которые вы позже захотите изменить по отдельности. Обратите внимание, что косая черта в путях репозиториев - это MUST .
~/project_root $ git add vendor/some_repo/ vendor/another_repo/
Затем измените some_file
в vendor/some_repo
и увидите разницу:
~/project_root $ 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: vendor/some_repo/some_file
Таким образом, вы можете запустить git add --all
и затем git commit "Changes ..."
в project_root
как обычно.