將多個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
沒有留言:
張貼留言