[教學] Git搬運repository部分檔案至新repository

有的時候專案開發久了,專案的程式會越來越大,或是其他原因,會想要把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

完成