有的時候專案開發久了,專案的程式會越來越大,或是其他原因,會想要把repo的一部分拆分出來至新的repo中,但是又不想要直接把檔案複製到新的repo,因為直接複製會讓commit history消失,本篇教如何轉移部分檔案至新的repo並能保留舊有commit。
這邊提供兩種方法 分別從repo A搬至repo B
方法一、
這方法比較常見,網路上搜尋到大部分都是這個方法,但是只能搬移一個資料夾
先把原本的repo資料clone下來
git clone <git repo A url> repoA
跳至repo的root資料夾
cd repoA
安全起見 可以先將origin remote刪除 (非必要,避免不小心推上原repo)
git remote rm origin
選擇要搬運的資料夾 輸入指令
git filter-branch --subdirectory-filter <target directory> -- --all
此時 這資料夾中的內容會移至repo的root資料夾中 這時創一個新repo要放這些內容的資料夾
mkdir <new_directory>
把剛剛那些內容移到資料夾中
mv * <new_directory>/.
接著用git把資料夾commit上去
git add <new_directory>
git commit
舊repo前置準備已經好了 接下來是要在加到新repo上
先把新repo clone下來
git clone <git repo B url> repoB
跳至新repo的資料夾中
cd repoB
把原本的repoA資料夾加至remote中
git remote add repo-A-branch <git repo A directory>
把剛剛repoA資料夾中的資料pull下來 (假如新repo已經有其他commit了 可以加上–rebase)
git pull repo-A-branch master
接下來就能直接push上新的repo中了
git push
完成
方法二、
第二個方法可以保留多個資料夾或是檔案 剛開始的步驟一樣
先把原本的repo資料clone下來
git clone <git repo A url> repoA
跳至repo的root資料夾
cd repoA
安全起見 可以先將origin remote刪除 (非必要)
git remote rm origin
接下來是用–tree-filter的方式把不需要的檔案濾掉
這邊注意 $(git ls-files | grep -v keyword1 | grep -v keyword2)
是哪些東西會被去除
grep不熟的可以google學習一下用法或用其他指令 並且這支援pipe可以接更多的keyword
git filter-branch --tree-filter 'rm -rf $(git ls-files | grep -v keyword1 | grep -v keyword2)' -- --all
等它跑完舊repo的前置準備就完成了 剩下步驟就跟方法一相同
先把新repo clone下來
git clone <git repo B url> repoB
跳至新repo的資料夾中
cd repoB
把原本的repoA資料夾加至remote中
git remote add repo-A-branch <git repo A directory>
把剛剛repoA資料夾中的資料pull下來 (假如新repo已經有其他commit了 可以加上–rebase)
git pull repo-A-branch master
接下來就能直接push上新的repo中了
git push
完成