[英]Git: Rebase a complete project including branch structure
在要從Mercurial轉移到git的項目中,需要重寫Mercurial特定的文件(歷史上很早的時候)(下圖中的X
)。 在此步驟之后,應該傳輸整個歷史記錄,就好像該文件始終處於新狀態一樣,幸運的是,這不應該導致任何合並沖突。
A---B---X
\
\--C---D---G---H master
\ /
E---F---I feature_branch
應該導致
A---B---X---C'---D'---G'---H' master
\ /
E'----F'---I' feature_branch
我能得到的最接近的是使用-p
選項將master
重命名為X
,但是仍然會為G'
產生合並沖突,盡管可以毫無問題地應用從D
到G
的差異。
Rebase不是復雜歷史重寫的正確工具。 filter-branch是正確的工具。 最簡單的方法可能是將您的文件放在某個文件夾中而不是在您的倉庫中,並運行樹過濾器--all --not A
將該文件復制到您的工作目錄中。
根據Chronial的回答,這是我使用的命令(在做備份之后):
B=abcd
X=1234
git filter-branch --parent-filter "sed -e s/$B/$X/g" --tree-filter \
"git checkout X $(git diff-tree --no-commit-id --name-only -r $X | tr '\n' ' ')" \
-- --all --not X
這里,首先將所有對B
父引用替換為對X
的引用,然后將通過此提交更改的文件插入到樹中。 此操作適用於不是X
本身的祖先的所有修訂。
然后,在檢查一切是否按預期工作並進行另一次備份之后(如果我將來需要它以供參考):
git for-each-ref --format='%(refname)' refs/original | xargs -n1 git update-ref -d
這將刪除由git filter-branch
自動為備份目的創建的所有refs/original/...
refs。
如果想要不可撤銷地刪除以前歷史記錄的所有痕跡並節省磁盤空間,現在可能是收集垃圾的好時機:
git gc --prune=now
而不是寫一個詳細的解決方案,其他人很容易做出回答。 這是一個視覺(交互式教程),將向您解釋您需要做什么。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.