利用git subtree可以實現多個倉庫合并為一個倉庫,手動操作起來太麻煩了,今天花了點時間寫了一個可執行的腳本,現在操作起來就方便多了。
1、本地新建setup.bat
文件
2、用編輯器打開(我用的是Notepad++)
3、把下面代碼復制進去
下面是六個代碼倉庫(在遠程倉庫,需要拉取)拉取合并為一個倉庫的腳本,根據實際情況修改合并后目錄、倉庫地址等
@echo off
setlocal enabledelayedexpansion:: 1. 強制清理舊目錄
:: project-dir是合并后目錄
set projectdir=project-dir
rd /s /q %projectdir% 2>nul
mkdir %projectdir%
cd %projectdir%:: 2. 初始化倉庫并創建 master 分支
git init
git commit --allow-empty -m "Initial empty commit (master)":: 3. 添加子項目遠程倉庫
:: 目錄和倉庫地址都是虛假替代的
git remote add dir1 https://gitee.com/3539949703/dir1.git
git remote add dir2 https://gitee.com/3539949703/dir2.git
git remote add dir3 https://gitee.com/3539949703/dir3.git
git remote add dir4 https://gitee.com/3539949703/dir4.git
git remote add dir5 https://gitee.com/3539949703/dir5.git
git remote add dir6 https://gitee.com/3539949703/dir6.git:: 4. 定義子項目列表
set "subprojects=dir1 dir2 dir3 dir4 dir5 dir6":: 5. 在 master 分支添加子項目的 master 分支
for %%i in (%subprojects%) do (git subtree add --prefix=%%i %%i master --squash
):: 6. 創建 develop 分支
git checkout --orphan develop
git reset --hard
:: 確保 develop 分支有初始提交
git commit --allow-empty -m "Initial empty commit (develop)":: 7. 添加子項目的 develop 分支
for %%i in (%subprojects%) do (git subtree add --prefix=%%i %%i develop --squash
)endlocalpause
4、打開Git Bash
客戶端,執行./setup.bat
,就完成合并為一個倉庫的任務。
5、查看了下提交的代碼,做了兩次commit提交,感覺git commit --allow-empty -m "Initial empty commit (master)"
和git commit --allow-empty -m "Initial empty commit (develop)"
這兩次提交沒有必要,所以更新了下合并腳本,如下:
@echo off
setlocal enabledelayedexpansionset projectdir=maven-project
cd %projectdir%set "subprojects=dir1 dir2 dir3 dir4 dir5 dir6":: 更新 master 分支
git checkout master
for %%i in (%subprojects%) do (:: 強制重置子項目目錄git checkout HEAD -- %%i:: 強制拉取遠程代碼(丟棄本地修改)git subtree pull --prefix=%%i %%i master --squash --force
):: 更新 develop 分支
git checkout develop
for %%i in (%subprojects%) do (:: 強制重置子項目目錄git checkout HEAD -- %%i:: 強制拉取遠程代碼(丟棄本地修改)git subtree pull --prefix=%%i %%i develop --squash --force
)endlocalpause
6、合并后,同事又繼續提交代碼到舊倉庫,所以就又寫了一個更新代碼的腳本,命名為update.bat
,源碼放在下面,執行步驟跟setup.bat
一樣,不贅述了。
@echo off
setlocal enabledelayedexpansionset projectdir=ewp-cloud
cd %projectdir%set "subprojects=dir1 dir2 dir3 dir4 dir5 dir6":: 更新 master 分支
git checkout master
for %%i in (%subprojects%) do (:: 強制重置子項目目錄(丟棄本地修改)git checkout HEAD -- %%i:: 拉取遠程代碼(去掉 --force)git subtree pull --prefix=%%i %%i master --squash
):: 更新 develop 分支
git checkout develop
for %%i in (%subprojects%) do (:: 強制重置子項目目錄(丟棄本地修改)git checkout HEAD -- %%i:: 拉取遠程代碼(去掉 --force)git subtree pull --prefix=%%i %%i develop --squash
)endlocalpause