Git 試用 submodule 管理子項目


這兩天學習了一下git的submodule子項目管理功能,記錄一下學習的東西。

以下示例都是在win的powershell中,linux下一樣

1 準備事項

1.1 安裝git

win: 下載安裝官網的git
centos: yum install git
ubuntu: apt install git

1.2 配置用戶名和郵箱

打開powershell

# 配置用戶名
git config --global user.name "myname" 
# 配置郵箱
git config --global user.email "[email protected]"

1.3 倉庫位置

倉庫的初始化位置,我這裏測試時都是全新建的空倉庫。

2 主倉庫引入子倉庫

只需要第一次運行一次即可。

2.1 初始化子倉庫

這裏的初始化不是git init命令這種初始化。由於將子倉庫添加到主倉庫中需要確保子倉庫不是空倉庫,所以需要在子倉庫中隨便添加一些東西,讓他不爲空。其實根本原因可能是git init的倉庫沒有分支,所以無法添加,這裏生成一個文件並推送,以確保遠程倉庫上主分支存在。

所以,如果你的子倉庫不是空的,就不需要這一步。

# 找一個位置來存放git倉庫,比如我的電腦上爲 E:\git 
# 進入git目錄
cd E:\git 

# 克隆子倉庫
git clone git@git.myserver.cn:library1 library1

# 進入子倉庫目錄
cd library1

# 隨意生成一個名爲 init 的文件
echo 'init' > init

# git 暫存文件
git add . 

# git 提交更改
git commit -m 'init'

# git 更新到遠程服務器
git push 

以上便實現了克隆library1倉庫,添加了名爲 init 的文件,並推送到遠程服務器。然後需要做的是將library1倉庫添加到主倉庫中

2.2 引入子倉庫到主倉庫中

# 克隆主倉庫
git clone git@git.myserver.cn:project_name project_name 

# 進入主倉庫
cd project_name

# 將library1倉庫引入主倉庫
git submodule add git@git.myserver.cn:library1 library1
# 如果子項目爲空, 會無法添加到索引, 需要更新子項目不爲空, 然後在這裏的子項目pull後, 再運行 submodule add 

# 更新主倉庫
# 查看git狀態
git status

# git 暫存變更信息
git add . 

# git 提交更改
git commit -m '添加子項目 library1'

# git 推送到遠程服務器
git push 

以上便實現了將子項目引入到主倉庫中。

2.3 刪除外部的項目

由於已經將項目添加進了主倉庫中,之前克隆的子倉庫(E:\git\library1)可以刪除了。當然這個隨便了。

3 修改子項目更新後本地主倉庫

這裏指的是直接在主項目中修改。

在主倉庫中的子項目,也可以作爲一個獨立的倉庫看待,所以一般的add、commit、push操作都正常進行。然後再在主倉庫中進行更新操作。

3.1 更新子項目

子項目路徑爲 E:\git\project_name\library1,子項目的更新方法與常規的操作一致。

# 進入子項目
cd E:\git\project_name\library1 

# 查看當前分支狀態 *號標明的爲當前所在分支
git branch -v

# 確保當前不在一個 detached 的分支下 我這裏切換到主分支 再在主分支下進行一系列操作
git checkout master

# 這裏作演示隨便生成一個文件
echo 'test' > test.txt 

# push三連
git add .
git commit -m '測試'
git push 

這樣完成了子項目的更新。

3.2 更新主倉庫

# 返回主倉庫目錄
cd E:\git\project_name 

# 查看狀態
git status

# 暫存倉庫變化
git add . 

# 提交
git commit -m '更新子倉庫引用' 

# 推送到遠程
git push 

# 查看更新後的狀態
git status

我這裏提示信息如下

PS E:\git\project_name\library1> git commit -m 'update git submodule '
[master 1c4b134] update git submodule 
 1 file changed, 1 insertion(+)
 
PS E:\git\project_name\library1> git push
Enumerating objects: 7, done.
Counting objects: 100% (7/7), done.
Delta compression using up to 12 threads
Compressing objects: 100% (4/4), done.
To git.myserver.cn:project_name/library1
   7271e29..1c4b134  master -> master

PS E:\git\project_name\library1> cd ..

PS E:\git\project_name> git add .

PS E:\git\project_name> git status
On branch master
Your branch is up to date with 'origin/master'.

Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
        modified:   library1

PS E:\git\project_name> git commit -m 'update submodule library1'
[master af2a40f] update submodule library1
 1 file changed, 1 insertion(+), 1 deletion(-)

PS E:\git\project_name> git push
Enumerating objects: 3, done.
Counting objects: 100% (3/3), done.
Delta compression using up to 12 threads
Compressing objects: 100% (2/2), done.
Writing objects: 100% (2/2), 252 bytes | 252.00 KiB/s, done.
Total 2 (delta 1), reused 0 (delta 0)
To git.myserver.cn:project_name
   27deb61..af2a40f  master -> master

4 如何同步別人的更改

當其他人更新了子項目後 或者 添加了新的子項目,如何同步自己這邊的主倉庫。

4.1 當其他人更新了子項目(未更新主項目)

使用git submodule foreach 命令。這個命令其實就是加在常規的git命令前面,表示是對每個子項目執行,所以一般git操作前面都可以加這個前綴

# 進入主倉庫目錄
cd E:\git\project_name

# 切換子項目的分支爲 master
git submodule foreach git checkout master 

# 獲取所有子項目的更新
git submodule foreach git pull 

# 查看主倉庫狀態
git status 

# 暫存主倉庫變化
git add .

# 提交
git commit -m 'update sub repo'

# 推送主倉庫的變化到遠端
git push 

4.2 當其他人更新了子項目(並更新了主項目)

# 進入主倉庫目錄
cd E:\git\project_name

# 獲取主倉庫的更新
git pull 

# 更新submodule引用
git submodule update

4.3 當其他人新增了子項目

比如有人新增了子項目 library2

# 進入主倉庫目錄
cd E:\git\project_name

# 拉取主倉庫的更新信息,主項目不會同步子項目的內容,所以目錄 library2 爲空
git pull 

# 同步library2的內容
git submodule update --init

運行提示信息如下

PS F:\git\project_name> git submodule update --init
Submodule 'library2' ([email protected]:library2) registered for path 'library2'
Cloning into 'F:/git/project_name/library2'...
Submodule path 'library2': checked out '00f77e54a94c7a2803f6d36e2c7cdd7c29cf22a6'

5 在新的電腦上克隆主倉庫

在新的電腦上使用,先確定一個倉庫存放的位置,比如存放到 F:\git 中。

# 創建一個git目錄
mkdir F:\git

# 進入git目錄
cd F:\git 

# 克隆 main 主倉庫到本地的 project_name 目錄
git clone git@git.myserver.cn:project_name project_name 

# 進入主倉庫
cd project_name 

# 初始化並更新子項目
git submodule update --init 

我的提示信息如下

PS F:\git\project_name> git submodule update --init 
Submodule 'library1' ([email protected]:project_name/library1) registered for path 'library1'
Submodule 'library2' ([email protected]:project_name/library2) registered for path 'library2'
Cloning into 'F:/git/project_name/library1'...
Cloning into 'F:/git/project_name/library2'...
Submodule path 'library1': checked out 'a7fc9483a7b982e8f6529fc12b69dba5479508ae'
Submodule path 'library2': checked out '00f77e54a94c7a2803f6d36e2c7cdd7c29cf22a6'

目前能想到的場景就這麼多。以後如果遇到新的再來更新。

子項目只需要添加一次,後面的日常更新主要參考3 4 5這幾部分。

完畢。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章