[英]Migrating a git-svn branch to a git branch
我的項目(相當大,大約200萬行代碼和數萬次提交)目前正在從git-svn切換到git。 許多用戶擁有git-svn分支,其歷史記錄在新的純git存儲庫中很有用。 基本情況是這樣的
老git-svn回購:
A-B-C-D-E-F (master)
我在這個存儲庫上有一個分支,它已經多次合並master,例如:
G-H---I-J-K (feature)
/ /
A-B-C-D-E-F (master)
我想將此分支移動到新的pure-git存儲庫並維護我的歷史記錄。 為了使事情變得更復雜,pure-git存儲庫和svn存儲庫的目錄結構略有不同。 具體來說,此存儲庫中的基本目錄結構有兩個目錄,例如:
foo/ bar/
在新的git存儲庫中, bar/
已被移動到新的存儲庫。
如何將此分支移動到新的存儲庫,並在pure-git repo中以類似的方式結束?
G'-H'----I'-J'-K' (feature)
/ /
A'-B'-C'-D'-E'-F' (master)
我認為以下內容可行:
從git-svn repo上的feature分支:
git filter-branch -f --index-filter "git rm -rf --cached --ignore-unmatch bar" B..HEAD
哪個應該刪除對foo目錄的所有修改,這在新的repo中是不存在的。 然后,將git-svn repo添加為純git repo的遠程,並從pure-git repo執行此操作:
git checkout -b B' feature
git rebase --preserve-merges --onto feature remotes/old_git_svn_repo/master remotes/old_git_svn_repo/feature
不幸的是,這似乎不起作用。 我仍然需要手動解決我已在功能分支中解決的所有合並沖突。 有辦法做我想要的嗎?
就像你一樣,你應該運行的第一件事是filter-branch --index-filter
來修復分支的樹結構。 但現在你需要修復父關系。 根據已合並的數量,有兩種選擇:
手動完成 :看看git help replace
。 git replace
允許您將一個提交替換為另一個提交。 為每個合並庫執行此操作。 例如:
git replace BB' git replace EE'
請注意,如果您未在master..feature
上運行filter-branch
,則B
可能已經具有不同的SHA。
完成此步驟后,您需要再次運行filter-branch
以使替換永久化。 我建議--index-filter
替換,然后運行--index-filter
。 通過這種方式,您可以一次性完成所有操作。
用--parent-filter做 。 看一下filter-branch
的--parent-filter
參數。 它將允許您指定腳本以重寫父關系。 該腳本可以使用git-svn-id:
應記錄每個端口提交信息中查找匹配的新承諾master
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.