簡體   English   中英

將git-svn分支遷移到git分支

[英]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.

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