簡體   English   中英

執行git子樹拆分時請遵循重命名

[英]Follow renames when performing git subtree split

我有許多子目錄,我想把它們分成一個單獨的倉庫。 為了使用單個命令提取它們,我將它們移動(重命名)到根目錄內的單個子目錄。

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

如果我然后檢查這個新分支並運行git log --follow someoldfile它只顯示與移動到臨時子目錄有關的日志條目。 我想繼續這些文件的完整歷史記錄。

有沒有辦法保存完整的歷史記錄,包括在進行子樹分割時重命名? 是否有另一種方法可以達到預期的效果?

我曾考慮在repo的克隆上使用filter-branch,但我知道這將非常慢。

實際上這是可能的,這個問題已在這里提出幾次,雖然沒有通用的方法,看起來你必須撰寫自己的食譜。

如果您只想從my_new_subdir保留文件, 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

通過這種方式,您可以隨時找到存儲在倉庫中的所有文件/目錄(或者只是前兩個路徑段)。 之后,您可以使用以下命令清理repo:

git gc --aggressive

因此,在將文件移動到my_new_subdir我已經使用上述命令的組合來清除歷史記錄中任何不需要的文件。 但是我仍然在歷史中發現了不相關的合並,但最后我對結果感到滿意。 請注意,上面有一些git命令的參數對於遍歷所有歷史記錄,分支和標記至關重要。

為了加快速度,您可以在第一次迭代中識別要刪除的repo的最大部分,然后執行git gc --aggressive 擁有i5 CPU和SSD磁盤我花了大約一分鍾來完成一個git filter-branch迭代,並且已經處理了大約1000個歷史條目。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM