сценарий проблемы
Я считаю, что любое развитие будет сталкиваться с ситуацией. Я работаю над разными проектами, но буду использовать некоторые общие блоки method_components_code и так далее. Как разработчик, стремящийся к элегантности, вы не должны мириться с операцией копирования и вставки фрагмента кода повсюду. А раз этот код нужно обновлять в будущем, если его везде вставлять, то нужно искать глобально и модифицировать со слезами. Так есть ли способ использовать его как «среду обитания» для некоторого общедоступного кода, который можно написать в одном месте и использовать везде?
Ответ положительный.
найти инструменты
После поиска на известном веб-сайте 404 я нашел функцию, встроенную в Git: submodule.
что такое субмодуль
Есть ситуация, с которой мы часто сталкиваемся: рабочий проект должен включать и использовать другой проект. Это может быть сторонняя библиотека или разработанная вами независимо для использования в нескольких родительских проектах. Теперь возникает проблема: вы хотите рассматривать их как два отдельных проекта и в то же время хотите использовать другой в одном проекте.
Git решает эту проблему с помощью подмодулей. Подмодули позволяют сделать один репозиторий Git подкаталогом другого репозитория Git. Это позволяет вам клонировать другой репозиторий в свой собственный проект, сохраняя при этом отдельные коммиты.
как пользоваться
добавить подмодуль
# 直接clone,会在当前目录生成一个someSubmodule目录存放仓库内容
git submodule add https://github.com/chaconinc/someSubmodule
# 指定文件目录
git submodule add https://github.com/chaconinc/someSubmodule src/submodulePath
После успешного добавления запуститеgit status
2 изменения будут найдены в родительском репозитории
- new file: .gitmodules
- новый файл: someSubmodule (на самом деле не файл)
Расширьте и скажите:
-
что такое .submodules .submodules — это файл, в котором записана конфигурация подмодуля текущего проекта, в котором сохраняется сопоставление между URL-адресом проекта и извлеченным локальным каталогом.
-
каталог подмодуля После добавления подмодулей выполните
git status
После этого вы увидите сообщение, подобное следующему
$ git diff --cached someSubmodule
diff --git a/someSubmodule b/someSubmodule
# 重点是下面这行的 160000
new file mode 160000
index 0000000..c3f01dc
--- /dev/null
+++ b/DbConnector
@@ -0,0 +1 @@
+Subproject commit c3f01dc8862123d317dd46284b05b6892c7b29bc
Хотя someSubmodule является каталогом в родительском репозитории, Git не перечисляет все изменения в нем, а рассматривает его как специальный коммит. PS: режим 160000. Это специальный режим в Git, который, по сути, означает, что вы записываете коммит как запись в каталоге, а не как подкаталог или файл.
клонировать проект, который уже содержит подмодули
После того, как обычный клон содержит функцию подмодуля, автоматически генерируется someSubmodule из-за существования файла .submodule. Но внутри пусто. Необходимо выполнить еще 2 команды.
# 用来初始化本地配置文件
git submodule init
# 从该项目中抓取所有数据并检出父项目中列出的合适的提交(指定的提交)。
git submodule update
------------------更好的方式---------------------
# clone 父仓库的时候加上 --recursive,会自动初始化并更新仓库中的每一个子模块
git clone --recursive https://github.com/chaconinc/MainProject
Рабочий процесс подмодуля git
Когда проект содержит подмодули, необходимо не только выполнять управление версиями в родительском репозитории, но и версии существуют в каталоге подмодулей. Новой проблемой также стало то, как выполнять управление версиями подмодулей в разных родительских репозиториях.
Самый простой способ для основного проекта - сосредоточиться только на использовании версии в основной ветке подмодуля и не использовать какие-либо версии веток внутри подмодуля.
Операция выглядит следующим образом:
cd submodulePath
git fetch
git merge origin/master
На данный момент в основном проекте вы можете видеть, что каталог подмодуля был обновлен. Конечно, это тоже немного неудобно в эксплуатации.Вот более простой способ:
# Git 将会进入子模块然后抓取并更新,默认更新master分支
git submodule update --remote
Если вам нужно обновить другие ветки, вам нужно настроить это отдельно.
# 将git submodule update --remote 的分支设置为stable分支
git config -f .gitmodules submodule.DbConnector.branch stable
Меры предосторожности
Продолжение следует
Следите за поддержкой
Справочная документация: