Руководство по использованию подмодуля Git (1)

Git
Руководство по использованию подмодуля Git (1)

сценарий проблемы

Я считаю, что любое развитие будет сталкиваться с ситуацией. Я работаю над разными проектами, но буду использовать некоторые общие блоки 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 status2 изменения будут найдены в родительском репозитории

  1. new file: .gitmodules
  2. новый файл: someSubmodule (на самом деле не файл)

Расширьте и скажите:

  1. что такое .submodules .submodules — это файл, в котором записана конфигурация подмодуля текущего проекта, в котором сохраняется сопоставление между URL-адресом проекта и извлеченным локальным каталогом.

  2. каталог подмодуля После добавления подмодулей выполните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

Меры предосторожности

Продолжение следует


Следите за поддержкой

关注一下给与鼓励

Справочная документация:

  1. Git — подмодули