2014-10-10 37 views
11

我有許多子目錄,我想將其提取到單獨的回購中。爲了使用單個命令提取這些文件,我將它們移動(重命名)爲根目錄內的單個子目錄。執行git子樹拆分時,請按照重命名

我然後運行:git subtree split -P my_new_subdir -b newbranch

如果我當時籤這個新分支和運行git log --follow someoldfile那隻能說明我屬於移動到臨時子目錄中的日誌條目。我想繼續這些文件的完整歷史。

有沒有一種方法來保存完整的歷史記錄,包括進行子樹拆分時的重命名?是否有另一種達到預期結果的手段?

我曾考慮在回購的克隆上使用filter-branch,但我知道這會很慢。

+0

有趣的讀取:http://stackoverflow.com/q/5760331/6309,http://stackoverflow.com/a/16416818/6309。不知道這是可能的。 – VonC 2014-10-11 07:04:37

+0

我想這是有道理的,如果目錄結構完全不同,將無法使用舊的更改。 – 2014-10-16 16:06:57

回答

8

其實這是可能的,這個問題已經提出了幾次,雖然沒有普遍的方式,它看起來像你必須撰寫自己的食譜。

如果您只想從my_new_subdir保留文件,您實際上需要自行刪除所有其他文件。這個概念是使用:

git filter-branch --tag-name-filter cat --index-filter \ 
    'git rm -r --cached --ignore-unmatch 
    unneeded-subdir-1 unneeded-pattern-* unneeded-etc' \ 
--prune-empty -f -- --all 

再幫找到你可以使用哪些人有被刪除某事像:

git log --name-status --all | grep -P '^\w\s+[\S]+$' 

甚至如:

git log --name-status --all | grep -P '^\w\s+[\S]+$' | \ 
    sed s/^.// | cut -f 1-2 -d '/' | sort -u 

這樣你可以隨時找到存儲在回購站中的所有文件/目錄(或者只是第二種情況下的前兩段路徑)。之後,你可以使用下面的命令來清潔回購:

git gc --aggressive 

所以移動文件後要留到my_new_subdir我用的上述命令,從歷史清理不必要的文件組合。不過,我仍然發現歷史上的無關聯合並,但最終我對結果感到滿意。請注意,上面提供了許多參數,這些參數對於遍歷所有歷史記錄,分支和標記都至關重要。

爲了加快速度,您可以確定要在第一次迭代中刪除的回購的最大部分,然後執行git gc --aggressive。有了i5 CPU和SSD磁盤,我花了大約一分鐘的時間來完成一個git filter-branch迭代,並且已經處理了大約1000個歷史記錄條目。

+0

這是我已經解決的解決方案,但從來沒有試過的解決方案。感謝您花時間回答。 – 2015-03-05 17:24:49