2012-12-19 67 views
6

我有一個git svn回購。我在這裏有多個發佈分支。我正在準備一個新版本,並且作爲其中的一部分,我想我會在前一版本中執行「git rebase」,以撤銷未合併的任何更改。「git rebase <branch>」上git svn回購更改遠程跟蹤目的地?

所以我建立了我的枝葉......

git branch new_release remotes/svn-branches/new_release 
git branch old_release remotes/svn-branches/old_release 

然後我做底墊...

git checkout new_release 
git rebase old_release 
# watch it pull a bunch of commits 
git svn dcommit 
    Committing to https://svn.mysvn.net/repo/releases/old_release ... 

,我做了 「SVN dcommit」 我幾乎crapped我的褲子後。這是在Subversion中哄我的舊版本分支!

爲什麼遠程追蹤分支因變形而改變?

我該如何解決自己陷入的局面?

編輯:好的,用於獲取自己離開我相信我能做到以下幾點:http://svnbook.red-bean.com/en/1.5/svn.branchmerge.basicmerging.html#svn.branchmerge.basicmerging.undo

,因爲只有那名對被拉到old_release的new_release分支提交了一把,我可以恢復它們單獨在SVN回購上。儘管如此,我仍然對這裏發生的事情感到困惑。

EDITx2:是的,這裏有一些步驟來驗證。

  1. 設置兩個的Git分支遠程跟蹤,SVN分支的分支
  2. 退房一個
  3. 運行git svn info並觀察URL指向正確的位置在SVN
  4. 運行git rebase <other_branch>
  5. 運行git svn info再次觀察URL改爲指向SVN中的其他分支位置

回答

7

看起來你在使用git-svn時犯了一個常見的錯誤。

在git-svn中沒有「跟蹤分支」這樣的事情。它始終確定分支的URL,通過第一個父記錄直到首次提交符合「git-svn-id:」簽名的dmitmit。該簽名附近的URL是提交將被推送的URL。但請注意,有一個雙重檢查:簽名附近的URL和修訂版本與.git/svn/refs目錄中的數據結構進行比較,以及URL和修訂版本是否與它們相矛盾(對於重新發布的提交,這是正確的,因爲rebase沒有觸及那些結構),它不被考慮。所以舊的分支URL是第一個沒有重定位的提交URL。

如果你想要純粹的Git體驗,你可以試試SubGit作爲git-svn替換。自2.0以來,它允許創建一個可寫的SVN倉庫的純Git鏡像,同時關注同步和併發性。運行

$ subgit configure --svn-url <SVNURL> project.git 
$ #adjust projectX.git/subgit/{config,authors.txt,passwd} 
$ subgit install project.git 
$ git clone project.git project/ 

安裝後,您可以將其用作普通的Git存儲庫。所以,你比如你運行:

$ git checkout new_release 
$ git rebase old_release 
$ git push origin new_release 
+0

subgit看起來確實很漂亮,可惜這是不可能的,我可以我們的SVN服務器上安裝它,有太多人依靠它而將是可以理解的厭惡安裝,當事情在很大程度上是「加工」。我應該怎麼做我在git-svn中要做的事情? – ashgromnies

+1

你可以在你的機器上安裝子目錄並指定--svn-url ,即它具有與git-svn幾乎相同的要求。 與git-svn ...我認爲你可以1)簽出new_release 2)確保HEAD已經在git-svn-id(即new_release的URL)提交正確的URL的消息3)通過git-svn-id:簽名(例如在提交之前使用「git cherry-pick -n」命令和編輯消息)或者通過「git filter-branch」命令重新綁定和移除它們。說實話,我不確定刪除git-svn-id簽名是否有必要,但我最好刪除它們。 –