2016-10-10 72 views
0

的我們有有platforms子一個大的庫,運行git過濾分支子目錄過濾器還去除擺脫其他子目錄歷史

sdk/ 
    .git/ 
    android/ 
    ios/ 
    unity/ 
    windows/ 

我們現在要打破到自己的倉庫。保持所有的歷史和分支。

我已經運行命令

git filter-branch -f --prune-empty --subdirectory-filter android -- --all 

看起來像它完成了我會想什麼,促進子android成爲這個新的版本庫的根,和我去推這一個新的遠程原點(在GitHub上)。

做這件事時,我得到了一個錯誤信息說有太大而不能推到遠程文件,但該文件的路徑是

unity/QAApp/... 

中的其他子文件夾的歷史當中存在我沒想到filter-branch --subdirectory-filter會採取。

我尋找到運行手動

git filter-branch -f --prune-empty --tree-filter \ 
'git rm -rf --ignore-unmatch ios unity windows && rm -rf ios unity windows' \ 
-- --all 

但好像這是雙打零工我瞭解filter-branch subdirectory-filter應該做的。這是預期的行爲,還是我錯誤地運行其中一個或其他命令?

回答

0

後有點背,並與git的郵件列表傢伙轉發,它似乎是這與過濾器分支的一個問題。這裏的主要問題是filter-branch只和與你指定的子目錄交互的分支進行交互。如果你有一些從未做過的分支,那麼命令不會靠近它們,在你的回購中留下你可能不想要的歷史。

得到我想要的第一種方式是明確指出,不與子目錄進行交互,在這種情況下android所有分支,

path=android/ 
git for-each-ref --format='%(refname)' | 
while read ref; do 
    if test "$(git rev-list --count "$ref" -- "$path")" = 0; then 
    echo "delete $ref" 
    fi 
done | git update-ref --stdin 

這個片段通過每一個分支運行引用您的git回購了,檢查看看它是否有你的子目錄的引用,如果沒有,請刪除它。

下一頁改變濾波器分支命令,

git filter-branch -f --prune-empty --tag-name-filter cat --subdirectory-filter android -- --all 

添加--tag-name-filter cat的命令重新進行標記,並從保持了不必要的歷史保持停止加標籤的分支。

末的事情,然後抹保持備份歷史,

git for-each-ref --format="%(refname)" refs/original/ | xargs -n 1 git update-ref -d 

過濾分店與之交互每個分支的備份。這是正確和正確的行爲,但爲此,當您要重寫所有歷史記錄並瞭解您正在執行的操作的後果時,請刪除備份是正確和可行的。

這一切後,你從它那子目錄中得到適當重做回購,只有歷史,一切將被丟棄,包括未與子目錄互動分支。

相關問題