其實這是可能的,這個問題已經提出了幾次,雖然沒有普遍的方式,它看起來像你必須撰寫自己的食譜。
如果您只想從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個歷史記錄條目。
有趣的讀取:http://stackoverflow.com/q/5760331/6309,http://stackoverflow.com/a/16416818/6309。不知道這是可能的。 – VonC 2014-10-11 07:04:37
我想這是有道理的,如果目錄結構完全不同,將無法使用舊的更改。 – 2014-10-16 16:06:57