【Git】原Git庫拆分子目錄作為新倉庫,並保留log記錄


一.需求描述:
現有一個git倉庫,Team A和Team B的人操作同一倉庫的不同目錄,Team A的dev希望Team B的dev沒有權限review屬於Team A的代碼目錄,故現需要先將這個git 庫下的子目錄進行拆分,為后續單git庫權限獨有覆蓋做准備.
二.操作背景:
Ubuntu shell(終端)
三.遷移(使用filter-branch命令)
由於我需要遷移的子目錄包含中文名,因此需要使用filter-branch命令來實現遷移,當然,如果不包含中文的目錄也可以使用git1.8版本以后的subtree來實現,該方法稍后說明。

  1. 首先,clone 一份原倉庫並刪掉原來的 remote:(依次執行以下命令)
    (1)git clone ssh://username@xx.x.xx.xxx:29418/vendor/lenovo
    (2)cd lenovo
    (3)git remote rm origin
  2. 然后運行如下命令(這是重點):
    (1)git filter-branch --tag-name-filter cat --prune-empty --subdirectory-filter -- --all
    這條命令同樣會過濾所有歷史提交,只保留所有對指定子目錄有影響的提交,並將該子目錄設為該倉庫的根目錄。這里說明各下個參數的作用:
    --tag-name-filter 該參數控制我們要如何處理舊的 tag,cat 即表示原樣輸出;
    --prune-empty 刪除空的(對子目錄沒有影響的)提交;
    --subdirectory-filter 指定子目錄路徑;
    -- --all 該參數必須跟在  -- 后面,表示對所有分支進行操作。如果你只想保存當前分支,也可以不添加此參數。
  3. 清理.git的object
    當上述命令執行完畢后,就可以看到本地的新倉庫已經是原倉庫子目錄中的內容了,且保留了關於該子目錄所有的提交歷史。不過只是這樣的話新倉庫中的
    .git 目錄里還是保存有不少無用的 object,我們需要將其清除掉以減小新倉庫的體積(如果你用subtree 的方法的話是不需要執行這一步的)。
    依次執行以下命令:
    (1)git reset --hard
    (2)git for-each-ref --format="%(refname)" refs/original/ |xargs -n 1 git update-ref -d
    (3)git reflog expire --expire=now --all
    (4)git gc --aggressive --prune=now
    溫馨提示:git gc操作耗時比較久,請耐心等待.
  4. 將新的本地倉庫推送到遠端
    cd到
    (1)添加遠端地址:
    git remote add origin
    (2)推送到遠端:
    git push -u origin master或者git push --fore origin master

四.補充subtree方式遷移
要求拆分的目錄沒有中文名
1.首先,進入 所在的目錄,創建一個 的臨時分支,運行:
git subtree split -P -b
2. 然后,我們創建一個新的 git 倉庫:
(1)mkdir  
(2)git init
3. 接着把原倉庫中的臨時分支拉到新倉庫中:
git pull </path/to/big-repo>  
好了,完成。現在看看你的新倉庫,是不是已經包含了原子文件夾中的所有文件和你之前在原倉庫中的所有提交歷史呢?后續步驟就可參照第二章中的3,4,5步了。

參考鏈接:
https://blog.csdn.net/wang252949/article/details/80003791
https://blessing.studio/splitting-a-subfolder-out-into-a-new-git-repository/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM