2009-04-17 247 views
9

我正在使用Git-Svn與工作中的Svn存儲庫進行交互,似乎無法找到有效解決衝突的方法來解決我的生活。我已閱讀關於此主題的其他問題,但顯然我需要更多補救措施,因爲我似乎總是以某種無休止的循環結束。我重定位,使用mergetool(meld)來解決我的衝突,並且當我完成所有這些時,我嘗試執行dcommit,並在提交錯誤期間收到合併衝突。解決Git Svn衝突

我知道這感覺像是重複的,但令人沮喪的是讓我再次問到,關於我如何去做這件事的一些非常具體的細節,以便希望有人能夠確切地告訴我我的過程被搞砸了。

我的設置:

我有一個遠程分支(SVN /主幹),一個本地分支(主幹)和另一個本地分支,我通常在(工作幹線)工作。樹幹從svn/trunk檢出,工作樹幹從trunk中檢出。

這就是我一直在做:

  1. 在我的樹幹,git svn rebase(返回衝突)
  2. git mergetool
  3. [解析該文件衝突]
  4. 保存合併後的文件從融合並緊密融合。
  5. git add .
  6. git rebase --continue
  7. [漂洗,重複]
  8. 如果我問一個消息我是否使用git add,我git rebase --skip

當我到的所有報告的變化結束,一切都只是停止,我想也許我不知道該怎麼做。 Git沒有顯示任何內容,我似乎回到了主幹上。然後Git允許我提交,但如果我之後立即嘗試重新綁定,我最終會重新解決我剛剛解決的衝突。

顯然我在這裏錯過了一個關鍵的部分,但我只是沒有看到它,它導致了很多問題和挫折。在Git中合併可能很容易,但我肯定不會發現這種情況。

謝謝。

更新:只是想拋出一個快速更新來描述我的工作流程,以防萬一是部分(或全部)問題。

首先,在使用svn/前綴克隆存儲庫後,我有我的svn/trunk遠程分支。鑑於:

  1. git co -b trunk svn/trunk檢查我的遠程到本地分支。
  2. git co -b working-trunk創建一個工作分支,我用它來創建一個更多的分離度,以便我的本地中繼可以始終鏡像我的遠程中繼。
  3. 我刪除了默認主分支(當使用svn時,我覺得用「trunk」而不是「master」來思考更容易)。

一旦我有我所有的分支,我的典型的工作流程是這樣的:

  1. 工作幹線,我做我的變化,並提交它們。
  2. I git co trunk並做一個git svn rebase
  3. 假設新代碼已重新發售,我git rebase working-trunk
  4. git co working-trunk
  5. git merge trunk
  6. git rebase trunk
  7. git co trunk
  8. git merge working-trunk
  9. git svn dcommit

這是一個很大的步驟,我知道,但這是建議每個人都在這裏和其他地方。在這個過程中,我的致命缺陷會在哪裏?

再次感謝。

+1

做了回答您採摘(Jistin's)解決問題? – inger 2010-06-17 14:19:00

回答

5

我會推薦使用git rebase而不是git merge。 Svn保持線性歷史,並且似乎與git分支合併有時混淆。使用git rebase可確保svn能夠理解線性歷史記錄。

請參閱: http://learn.github.com/p/git-svn.html瞭解更多信息和指南。

1

我試着用一個(我承認很小)的衝突,我強迫,並在git svn dcommit後,我沒有進一步的衝突。一個區別是我沒有收到關於git add的消息。您的團隊是否可能只是發送大量與您的工作衝突的提交?這似乎不太可能,但似乎是最簡單的解釋。

您可能需要花時間在不同位置再次獲取repo,並測試是否可以推送非衝突性更改以確保在以某種方式隱藏的dcommit階段沒有通信問題。

更新:我有一個想法:當我完成解決衝突時,我做了一個git add foo.bargit add .是否在意料之中?我沒有真正擴展git svn的功能,所以這些都是WAGs。

+0

這也可能是因爲我對我的存儲庫的處理方式太sl but,但我不確定該如何/爲什麼會這樣。我遇到過幾次,每次都徹底殺死和重建我的回購協議。非常令人沮喪。 感謝您的想法。 – 2009-04-17 13:31:29

1

看來有些東西並不按照您認爲的方式運行。如果這不是漢克蓋伊提出的不太可能的事情,那麼這是另一件不太可能的事情。

我的可能性不大可能是你的分支結構不符合你的想法,或者你沒有在你認爲自己的分支上重組。因此,我建議你:

  1. git branch只是爲了確認您的分支結構是你所期望的

  2. 添加
    export PS1='\e[0;31m\n\w$(__git_ps1 "(%s)") $ \e[m'
    到〜/。.bash_profile中,並再次登錄,
    展現在你的提示分支(和任何進程的git命令):

    /工作區/ wikka(featurebranch1 | REBASE-I)$

這將使你更多的反饋意見(可能會消除這個WAG)。

0

我會建議只使用git-svn在您的本地中繼線和遠程中繼線之間。在您當地的中繼與本地mytrunk之間,堅持只有標準的git唯一功能。你可能嘗試的工作流程是這樣的:

[SVN]---git-svn---[trunk]---branch---[mytrunk] 

要合併,切換到幹線並做了:

git svn rebase 

這拉從遠程更改,並主幹將其合併。然後,切換到mytrunk並做了:

git rebase 

這是直接從樹幹變化,並與mytrunk合併。我認爲它應該工作。否則,只是git克隆本地中繼線,而不是克隆工作。

+0

這聽起來像我所做的,如果我正確理解你的話。我會用我的工作流程更新我的原始問題。 – 2009-04-19 18:49:11

0

我剛剛在使用推薦的工作流程時遇到了這個問題,所以我認爲我們在這裏沒有答案。

下面是我進入這種情況。

我有一個通過git svn使用Apache基礎設施的git repo。

我有一個本地分支。

我試着按照這個程序:

1)rebase trunk。 2)將樹幹合併到私人分支。 3)做功。 4)rebase trunk。 5)將私有合併到主幹中。 6)dcommit。

但是,我搞砸了,我忘了推動從私人到主幹的改變。然後,我對我的私人分支進行了一系列其他更改,最終在衝突和重複循環中進行了完全虛假的衝突。我推出的最後一項改變是將一行註釋掉。當我在被忽視的變化中刪除了這條線時,無論如何,它產生了無法解決的衝突。我最終使用了 - 跳過它。

1

人們可能會發現SubGit「的做法更容易一點:

  1. 在服務器端安裝SubGit到Subversion版本庫
  2. 使用gitgit-svn發送更改SVN倉庫*

SubGit安裝會創建SVN存儲庫的Git副本。將此存儲庫克隆到本地存儲庫;創建任何分支並將它們推送到遠程Git存儲庫,SubGit自動將這些分支轉換爲SVN。

欲瞭解更多詳情請參閱SubGit documentationgit-svn comparison

*適用於任何Git客戶端。

3

我最終遇到了同樣的問題(git svn rebase返回衝突)。 我在工作流程中發現了這個問題。這裏是我的工作流程/你應該遵循:

git svn rebase # put all the new commits on top 

git svn dcommit # push the new commits to svn (will rewrite each commit message to add the svn tag) 

git pull # merge the conflicts due to the commit messages 

git push # push the synchronized version to the remote git server 

每當我忘了dcommit後合併的歷史,我如果我做新的提交出現新的(假的)衝突。爲了解決這些問題,你可以跟着你上面,或者如果它是已經描述的方法由於完全一樣的問題,因爲我,你也可以做到自動方式使用:

git svn rebase --strategy ours 
+0

事實上,我遇到了一些與我們的戰略有關的問題。它似乎忽略了新的提交。現在,我只需運行`git rebase --skip',直到停止抱怨爲止。 – user1448926 2013-06-26 20:25:40