2013-01-05 66 views
1

我有一個SVN倉庫,我用git-svn檢出,使用--stdlayout選項(那時候倉庫回覆爲空)。git-svn提交到錯誤的分支/如何通過git-svn合併svn分支

然後我在主分支上工作了一段時間。當使用git svn dcommit時,它會像我們應該那樣svn提交我的更改到https://my.host/repo/trunk

在某些時候,我用git創建了一個名爲「算術」的分支。後來我想在svn中創建該分支,所以我按照網站的建議做了git svn branch arithmetics,然後git branch --set-upstream arithmetics remotes/arithmetics。我想這是事情出錯的地方,因爲我收到了關於--set-upstream被棄用的警告。

當致電git svn dcommit時,它會承諾https://my.host/repo/branches/arithmetics,迄今爲止這麼好。但後來我注意到,dcommit將提交到該分支,無論當前在git存儲庫檢出分支,當我嘗試合併分支回到主。

我甚至嘗試從svn創建一個新的克隆,將分支合併到主目錄中。我也嘗試用git checkout -b local/trunk remotes/trunk明確檢查trunk,然後將分支合併到該分支中,然後合併git svn dcommit。它會一直致力於分支。

我該如何解決這個問題?

PS:我使用git rebase進行合併,因爲我讀過merge-commit與git-svn有問題,所以我沒有任何這些。

+0

提交命名很容易明白的地方混帳SVN dcommit將發送更改:運行「git log」並查看「git-svn-id:」簽名。將有URL發送更改。 –

回答

1

因爲Git和SVN有完全不同的分支概念,所以你不能將dmitmit git分支到SVN倉庫。與git合併,然後調用dcommit將線性化您的歷史記錄(與rebase完全相同),然後推送到當前簽出的分支。

下面是從git svn手冊頁的重要組成部分:

MERGE TRACKING
雖然混帳SVN可以跟蹤複製的歷史(包括分行和標籤)爲 庫採用標準佈局,它還不能代表合併 歷史發生在SVN用戶的上游。因此,建議用戶在git 內保持歷史儘可能線性,以便與SVN兼容(請參閱下面的CAVEATS部分)。

此外,caveats部分有專門針對您的問題段:

運行git合併或混帳拉不建議您計劃 從因爲Subversion用戶無法看到任何合併到dcommit分支你做了 。此外,如果你從SVN分支的鏡像git分支合併或拉出,dcommit可能會提交錯誤的分支。

如果合併,請注意以下規則:混帳SVN dcommit將嘗試 對SVN的頂部犯

git log --grep=^git-svn-id: --first-parent -1 
+0

是否意味着,我不能從git中合併我的SVN分支,因爲它中的提交已經被提交給svn?或者我可以更改提交的git-svn-id? – crater2150

+0

我想如果你想使用Git來合併SVN分支,你必須做一個--squash合併,然後手動設置合併屬性(這一步是可選的)。我不知道你的特定提交是否已經在SVN倉庫中 - 你是唯一可以找出(svn log,git log,git svn log,...) – knittl

+0

謝謝,用--squash合併我可以修復我的回購。 – crater2150