2009-07-15 115 views
25

我使用的git - svn的有以下工作流程現在混帳SVN工作流程 - 功能分支和合並

git clone <SVN TRUNK URL> #done once 

後來,當我在一個功能正常工作

git branch featureZ 
git checkout featureZ 
#make edits for featureZ 
git commit 

git checkout master 
git svn rebase # fetch changes from server 

git checkout featureZ #go back to branch 
#git merge master 
git rebase master #get the changes from SVN->master onto the branch now. Optional if I want the branch to be current. (EDITED: Got from the answer given below) 

#make edits for featureZ 
git commit #featureZ completed 

git checkout master 
git merge featureZ #getting featureZ onto master. Prepare to send to SVN 

git svn dcommit #push featureZ back to SVN 

現在的一些注意點,當我做功能合併到master,featureZ分支中的所有單獨提交合併爲一個對我來說很好。

提交消息被替換爲「與featureZ合併」。這可以通過merge fmt msg修復。

現在我的問題是 有沒有什麼可以出錯的工作流程或需要照顧。我在git-svn manual中讀到,在使用git svn時不應該完成合並。我在工作流中所做的是他們所指的是什麼?如果是的話,會造成什麼樣的問題?有一件事是我不想做一些與SVN主線混淆的東西。

+5

順便說一句,你可以使用`git checkout -b`而不是`git branch ..; git checkout`。另外,`checkout`命令使用`co`別名是很常見的。 – jfs 2010-11-27 12:12:47

回答

26

SVN無法處理非線性歷史(它根本沒有它的標記)。所以你想要做的是代替合併,因爲它保留了SVN的線性歷史記錄(這是在git-svn手冊頁上指出的)。

詳細說明,直線(從A到B到C到D),而非線性的歷史可以從(A到B到C,B到D然後C + D到E - 換句話說,它們脫落成枝條)。

重新分配會給你一個線性歷史記錄,應該從你的私人本地分支完成分配,例如,如果你有2個分支:master和experimental,你可以結算實驗並最好做'git rebase master'與-i旗相反,這樣做可能會導致不良的副作用

然後你簽出master併合並來自實驗分支的變化。你的歷史應該保持線性。

+0

你能解釋什麼是非線性歷史嗎?另一件事是我不想(謹慎)SVN需要知道我有我合併的本地分支機構。你在哪裏建議需要在工作流程中完成rebase? git rebase featureZ? – Pradeep 2009-07-15 06:24:25

+0

我詳細闡述了我的答案。希望能幫助到你。 :) – 2009-07-15 06:43:20

4

你應該看看這個合併選項:

git checkout master 
git merge --squash featureZ 

將壓扁的分支的所有提交到一個單一的提交上的主分支。您將有機會編輯日誌消息,該消息將通過分支上完成的操作摘要進行初始化。

它的缺點是不會記錄特徵分支上的單個提交。此外,你只應該這樣做一次,而不是在分支上做更多的工作,因爲它沒有被註冊爲適當的合併,並且任何後續的合併可能會給出不希望的結果。

2

由假代碼猴子rashid給出的答案是正確的。這不是一個答案,更多的是簡化。

你可以從任何git分支svn rebase/dcommit。 主人的唯一用途是,如果您有其他本地更改需要合併功能Z的更改。

git branch featureZ 
git checkout featureZ 
#bunch of changes 
git commit 
git svn rebase 
# solve any conflicts 
git svn dcommit 

如果你想保持一個乾淨的高手,那麼你可以git svn rebase,或git merge featuresZ

0

而不是混帳SVN,你可以使用SubGit。這是一個服務器端工具,可以自動同步Subversion和Git存儲庫。

您可以使用任何Git工作流程和任何可用的Git客戶端,無需額外的客戶端工具。

考慮您的方案:

git branch featureZ 
git checkout featureZ 
# make edits for featureZ 
git commit 
git checkout master 

您可以進行如下操作:

  1. 推送特性分支完全。

    git merge featureZ 
    git push origin refs/heads/* 
    
  2. 在master/trunk之上重建一個功能分支。

    git rebase featureZ 
    git push 
    
  3. 壁球從功能分支提交。

    git merge --squash featureZ 
    git commit 
    git push 
    

只要你推變化,SubGit鉤翻譯更改爲顛覆修訂。

更多的細節:在許多方面

  • SubGit比混帳SVN更出衆 - 更好的合併跟蹤翻譯,EOLS & MIME類型支持等
  • SubGit需要顛覆本地訪問資源庫(它使用自定義鉤子);
  • SubGit是一個帶有一些免費選項(開源和學術項目,小團隊)的商業產品。