2010-05-14 78 views
28

我正在使用git-svn與SVN存儲庫一起使用。我的工作副本已使用git svn clone -s http://foo.bar/myproject創建,以便我的工作副本遵循SVN(中繼,標記,分支)的默認目錄方案。git-svn:重置跟蹤大師

最近我一直在使用git-svn branch myremotebranch創建並使用git checkout --track -b mybranch myremotebranch簽出的分支。我需要從多個地點開展工作,所以從分支機構I git-svn dcommit -ed文件到相應的SVN存儲庫都會定期進行。

完成我的更改後,我切換回主站並執行合併,提交合並,並嘗試將成功的合併提交到遠程中繼。

它好像在合併後的主遠程跟蹤已切換到分支我工作:

# git checkout master 
# git merge mybranch 
... (successful) 
# git add . 
# git commit -m '...' 
# git svn dcommit 
Committing to http://foo.bar/myproject/branches/myremotebranch ... 
# 

有沒有一種方式,以便它下面remotes/trunk,我可以更新主合併之前?

我使用git 1.7.0.5,如果這是任何幫助。

如果你還可以解釋爲什麼發生這種情況,這將是有用的,所以我可以避免再次發生問題。謝謝!

編輯:

這是我目前的.git/config

[core] 
    repositoryformatversion = 0 
    filemode = true 
    bare = false 
    logallrefupdates = true 
    autocrlf = false 
[svn-remote "svn"] 
    url = http://foo.bar/myproject 
    fetch = trunk:refs/remotes/trunk 
    branches = branches/*:refs/remotes/* 
    tags = tags/*:refs/remotes/tags/* 
[branch "mybranch"] 
    remote = . 
    merge = refs/remotes/myremotebranch 

如此看來,樹幹指向正確的位置。但是,切換到分支然後回到主人不會幫助;主人仍然試圖推到myremotebranch

回答

22

當主幹上沒有變化時,git執行快進合併,並簡單地將本地「主」分支設置爲分支上的提交。 Git-svn不知道如何將快進合併回到主幹,實際上現在認爲「主」現在指向了svn分支。

要解決此問題,請在合併時使用git merge --no-ff。這將強制git創建一個合併提交,然後可以將其提交給svn。

+1

'--no-ff'的好處。 +1 – VonC 2010-08-12 18:30:15

+0

爲了澄清,如果我明白,git使用「master」指針所在的提交來決定要提交哪個SVN分支。這就是爲什麼SVN dcommit步驟失敗的原因,因爲完成合並後,'mybranch'和'master'在同一個提交中。該提交最初是由'myremotebranch'SVN分支創建的。 – cmcginty 2010-08-13 10:16:55

+2

我不認爲創建新的合併提交將有助於澄清問題,因爲合併信息在傳播到svn存儲庫時會丟失。 – 2010-08-13 18:51:51

5

如果您還沒有對主人提交任何提交,這意味着git merge mybranch是一個快進:master HEAD只需移動到mybranch HEAD

這可以解釋爲什麼git svn dcommit將您的更改推送到SVN mybranch
會:

  • 第一次更新相應的SVN分支最後的Git mybranch犯下尚未dcommitted,
  • 記錄合併到主幹上SVN側
  • 的,然後它會重訂上的主Git方(無所事事,已經在那裏)。

我不認爲主並沒有改變其基準,但如果你有一個疑問(和你的工作目錄是乾淨的),你可以(如果主當前已檢出):

git reset --hard remotes/trunk 
+0

好像重置,改變主人的某些東西,然後重新合併,這樣就會產生衝突,解決衝突,然後解決問題。雖然它並不令人愉快。 – 2010-08-10 14:05:37

+0

@digitala:你的意思是單靠重置是不​​夠的? SVN中繼沒有發生復位後的第一個dcommit? – VonC 2010-08-10 14:09:14

4

一般來說,你不應該使用git mergegit svn,因爲svn,即使有分支,也不支持git所做的合併跟蹤。當你需要合併一個分支時,我已經取得了最大的成功(至少在最近的svn中)做了一個普通的svn結賬/合併過程,然後使用git svn rebase來更新我的git-svn軟件倉庫。這保留了svn的本地合併跟蹤元數據,其中(AFAIK)git-svn完全無知。

我不完全確定你的svn倉庫在什麼狀態 - 我會檢查以確保合併dcommit在幹線上做了你想要的。即使有, 我敢打賭,如果您查看回購庫中refs/heads/masterrefs/remotes/trunk文件的內容,您會發現它們目前有所不同。如果是這樣的話,我會(在沒有本地變化的情況下)做一個git-svn fetch,然後跟一個git branch -f master remotes/trunk; git reset --hard master重新同步git-svn跟蹤分支的git分支。如果您有本地更改,則必須提交併執行諸如git rebase master^4 --onto remotes/trunk之類的操作,其中4是您需要保留的提交數量。或者,如果它們全部未提交,則首先用git stash藏起來。

如果失敗了,你可以將所有東西都放到svn中,然後擦拭回購並獲得新的結帳。

+0

我同意這種分析。 +1 – VonC 2010-08-12 18:29:41

0

我有同樣的問題,我合併遙控器/主幹回主之後,混帳SVN信息指出回主幹

我沒得實際工作dcommit的時候,因爲我要離開這個項目,我的git-svn repo隨着我的崇拜而死亡。我確實嘗試了dcommit - drry-run,它表示它會回覆主幹。

我會重現設置和測試時,我得到的時間

歡呼

12

如果git svn rebase切換回主後以及使用時--squash你能避免這種情況。

# git checkout master 
# git svn rebase //(<--the missing step) 
# git merge --squash mybranch // (<-- doesn't commit, more like an svn merge would do) 
... (successful) 
# git add . 
# git commit -m '...' 
# git svn dcommit 
Committing to http://foo.bar/myproject/trunk... 
# 

爲了解決(即你的主人指向一個SVN分支)的當前狀態

你可以「切換」到另一個分支,刪除的主人,「開關」回來吧,然後再合併:

# git checkout mybranch 
# git branch -D master 
# git checkout -b master trunk 
... continue with merge... 
# git merge --squash mybranch 

......你現在有mybranch合併到主,並準備commit然後dcommittrunk

+1

非常感謝這個解釋,包括'解決當前狀態'一點。我在同一個泡菜中,而且這個工作非常巧妙地解決它。 – sockmonk 2012-08-01 15:27:35

+2

我不認爲'git checkout -b master master'是正確的。它應該是'git checkout -b master remotes/git-svn' – janos 2012-08-03 14:03:51

+0

如果你想要工作(即合併)一個名爲「git-svn」的SVN分支,但是如果你試圖合併到中繼和你的SVN repro是「標準」(例如在同一目錄中有/ branches/tags/trunk),那麼'git checkout -b master trunk'絕對正確 – dyodji 2012-08-13 23:38:24

3

我們在git-svn特性分支開發中成功使用git merge --squash。 git-svn的問題在於,當你的本地git-svn克隆可以存儲合併信息時,一旦你提交到svn倉庫,它就會丟失。

因此,對於其他(git-)svn用戶,合併提交看起來就像純粹的提交。該壁球與git merge --no-ff(例如,在主服務器上產生合併提交)相同,但它也包括在被合併的分支中作出的實際提交列表,否則在提交時會丟失該列表。