2021年4月14日 星期三

將多個git倉庫合併為一個新的git倉庫

將多個git倉庫合併為一個新的git倉庫

這個可能發生的概率不大,我會遇到是因為在做練習的時候是個別對每個專案追蹤,產生無數個git倉庫,最後整理的時候想一口氣上傳到github備份才想到說這麼多個怎麼處理。

當然最簡單的就是個別把git倉庫移除,也就是直接暴力刪除隱藏資料夾 .git 文件就可以從最外層重建一個倉庫一口氣追蹤全部檔案,不過這樣也會導致之前寫的commit信息不見就是了。

想要保留commit信息,找了很多方法最後是有搞定大概說明一下怎麼做。

以下指令是順著一直做下去的,不要中圖關掉了可能會導致錯誤。


建立模擬倉庫

先說明一下範例檔案,現在作為示範先個別建立幾個子倉庫

樹狀結構長這個樣子

到時候做好的主倉庫也會像這個樣子的結構

git
├── git1
│   └── project1.md
├── git2
│   └── project2.md
└── git3
    └── project3.md

個別在資料夾內提交一個信息模擬要處理的情況

git init
git add *
git commit -m project1的提交信息
cd ..

三個都做或是只做一個可以,剩下的都一樣的指令,改位置而已


建立新的主倉庫

再來建立一個新的倉庫,這個用來當合併所有倉庫後的主倉庫的
我把它取名 git0 位置是在剛剛的樹狀圖 git 資料夾下跟其他git倉庫放一起

主倉庫裡面就放一個 README.md 這個自己建立。直接創一個 新文字文件.txt 也行隨便放點東西。

mkdir git0
cd git0
git init
git add *
git commit -m 初始化總倉庫

好了再來就準備下一步了,現在建好樹狀圖會像這樣

git
├── git0
│   └── README.md
├── git1
│   └── project1.md
├── git2
│   └── project2.md
└── git3
    └── project3.md


在主倉庫新增遠端庫

先新增鏈結並更新

git remote add git1 C:\Users\hunan\Desktop\git\git1
git fetch --all --tags

切到該節點並新增一個分支追蹤

git checkout git1/master
git checkout -b fix1

這裡的分支千萬記得要一開始就建立,分支會紀錄起點在哪裡。到時候合併後的 commmit 紀錄只會追到建立分支之前的提交點。

移動檔案打包到資料夾內

mkdir git1
git mv project1.md git1
git add *
git commit -m 倉庫1打包完成


合併倉庫

合併要分兩個部分,先在支線把檔案打包到新資料夾內,然後在把這個支線rebase到主線,最後在切回主線把這個分支併入。

從分支rebase主線

git rebase master

這裡我開一個新資料夾包進去,就不會有檔案變更的衝突
如果你不是這樣做發生衝突要自己在這裡解決才能下一步

回到主線把剛剛分支合併

git checkout master
git merge fix1 --no-ff

—no-ff 會把當初合併的分支的線路顯示出來,合併後就不是一條直線,而是可以看到過去是一條分支合併進來的。

詳細可以參可底下的圖,那條黃線就是指令弄出來的,沒加就只有一條橘線,個人覺得這樣比較清晰,加不加看情況和自身的習慣。


移除遠端庫和分支

最後就是處理殘留下來的垃圾了,上圖中的 fix1 標記,和最底下的 git1/master 這兩個標記是可以移除的。

git remote remove git1
git branch -d fix1

分支可以留方便記錄,遠端庫是本機的完全沒用建議砍了


結束

好啦至此就完美解決了,線路也很完美漂亮。全部搭完會有一條很完美的長線吧

缺點就是工作量有點大,如果專案太多手動打可能打不完。我現在就處於這個狀況,要不寫個批次檔給他跑,不然就算了…好麻煩,直接放棄紀錄全部重新提交不香嗎QuQ

沒有留言:

張貼留言