2010-08-30 31 views
10

我有一個樹幹設置,我所有的生產代碼都去了。將GIT-SVN調試 - >功能分支轉移到中繼線的最佳方式是什麼?

然後,我有一個debug分支(父是trunk),我添加了諸如日誌記錄,var轉儲等調試代碼......這應該永遠不會在生產中。這個分支很少改變。

最後,我有一個feature分支(父母是debug),在那裏我所有的編碼與調試的好處。這個分支有不斷的提交。

我只想知道是否有更簡單的方法將我的feature代碼移動到trunk。這是我目前做的:

  1. 提交所有更改我的feature分支
  2. 切換到其他開發者mastergit svn rebase變化。
  3. rebasefeature分支到master分支(git rebase --onto master debug feature
  4. merge功能master
  5. git svn dcommit更改其他開發者
  6. rebasedebugmastergit rebase master debug
  7. 刪除feature分支
  8. 創建來自的新分支。
+0

也許我應該把它作爲一個新問題,但是將調試代碼放在它自己的分支中,而不是在運行時可以打開/關閉的東西是一個很好的做法嗎? – Damien 2010-09-15 13:56:57

+0

就我個人而言,我不想冒着忘記將#ifdebug語句添加到我的代碼並最終將內容發送到生產環境中的風險。我也玩過補丁的概念。創建一個我將在開發過程中應用的調試補丁,並在準備好發佈時解開它,但這會導致衝突,並試圖使補丁保持最新,這是一個痛苦。 – 2010-09-15 15:41:36

+0

@Damien:就我個人而言,我與你同在。我認爲更爲理智的解決方案是允許在運行時啓用/禁用調試內容(或者在編譯時*至少*)。 – 2010-09-15 19:32:03

回答

1

我會說你的工作流程非常優化。我會認爲選櫻桃是一個過度殺手(但它取決於提交次數)。

你可以做的是將所有的提交壓縮成一個,然後櫻桃採摘/ rebase只是這一個。

順便說一句,爲什麼不寫一個簡單的腳本,如果它是你一直在做的事情? Git是一個低級別的工具,因此編寫額外的腳本來幫助完成重複任務是一個非常好的主意。

+0

是的櫻桃挑選似乎很多工作。除此之外,當我做一個合併到主幹時,我做了一個--squash,所以SVN將最終提交視爲一次提交。而且我對這件事情確實有一個bash腳本,只是不知道是否有更簡單的方法,因爲我在每一步都「暫停」以檢查沒有出錯,工作正常,只需要隨時觀看。 – 2010-09-14 20:06:19

+0

@JD只需檢查git返回值,如果失敗了,只需運行bash。這將爲您提供一個交互式提示來解決問題,當您退出提示時,該過程將繼續。 – 2010-09-15 09:39:08

+0

不是一個壞主意,我會試試看。 – 2010-09-15 15:32:18

0

我們爲每個功能或錯誤修復設置了獨立的分支。這些可以在經過充分測試後合併回主幹。

分支可以更新,如果他們有點舊。

我們傾向於直接向主幹發佈較小的更改,但對於更重要的更改,我們將它們收集到候選發佈分支中,我們將所有包含更改的相關分支合併到發佈活動中。這個新的分支可以被部署和測試,以確定在最終合併回主幹並投入生產之前,組合變更是否會破壞任何東西。

該方法創建了很多分支機構,但由於我們將這些與這些與問題跟蹤系統相關的名稱命名,因此很容易跟蹤。很容易包含或排除對發佈的任何更改。

希望有幫助

+0

我的問題是更具體的GIT,我喜歡你將其中大部分融入到我當前的工作流程中,但爲了簡單起見,我描述了一個基本示例。 – 2010-09-09 04:46:55

0

我認爲你要找的是git-cherry-pick。這使您可以應用來自主控功能的提交,而無需執行您所描述的反彈舞。

既然你要刪除功能分支無論如何你不需要看到我假設的顯式合併。

1

好吧,我會說一個異端,每個人都會投票給我,但我們走吧。如果你直接使用svn,你的工作流程會簡單得多。

使用--reintegrate feature of subversion可以很容易地維護中繼線和調試分支同步。要合併您的功能分支,您需要合併主幹中功能分支的所有修改。該命令會是這樣的:

要合併主幹調試:

cd debug_branch_workcopy 
svn merge --reintegrate http://server/project/trunk . 
svn commit 

新特性分支合併到主幹:

svn log --stop-on-copy http://server/project/branches/feature123 #see the last revision listed 
cd trunk_workcopy 
svn merge -r{revision_above}:HEAD http://server/project/branches/feature123 . 
svn commit 

您可以運行上次合併命令多次如果您在合併後更改分支。 Subversion會記住已經合併的修訂版本,不會嘗試執行兩次。如果你在Windows中,免費的TortoiseSVN會給你一個很好的合併界面。

順便說一句,我會盡量不要一個單獨的分支只是調試功能。製作手動錯誤並將調試代碼發送到生產中心非常容易。我會用更動態的東西在生產中不運行調試代碼。

+0

Yup遇到了將調試代碼發送給SVN的問題,這就是我切換到git的原因之一。我可以告訴它在調試提交後複製到HEAD而不必跟蹤修訂號。 – 2010-09-15 15:35:10

0

您的工作流程很複雜,因爲您要做的事情很複雜。我所知道的任何VCS都可以讓您輕鬆維護一些永遠不應該合併的更改。它說了很多關於git的力量,你的工作流程並不比現在更困難。

我認爲你的語言有某種條件編譯機制(#IFDEF預處理指令等)。如果您將調試代碼封裝在這些代碼中,您將體驗到更少的摩擦。

+0

我正在用PHP進行Web開發,因此#ifdef方法可以工作,只需要與我的老闆交談,看看它是否會飛。 – 2010-09-15 15:37:42

1

如果我正確地理解了你,你只想在你的(非常靜態的)調試分支中有你的調試功能,而不是在你的主分支中。試試這個:

做調試的「假合併」成主

git checkout master 
git merge --no-commit debug 
git checkout master .  # undo all changes, get the files from master again 
git add .     # stage all files 
git commit 

這樣,調試將被合併到主,但沒有在主檔案都會發生變化。

現在,您只需在調試之上創建功能分支,並在完成後將它們合併到主控中。 Git的現在知道的調試功能從主剝離:

git checkout debug 
git checkout -b new_feature # create a new feature branch 
# hack, hack, hack 
git commit 
git checkout master   # All works fine... 
git merge new_feature  # ...so merge into master. Debug code will be stripped here 

您可以快進上new_feature調試分支並在此之後刪除new_feature分支。

請注意,每當您更改調試分支時,您必須重做假合併過程。

+0

調試分支正在工作,它正在從功能分支移動變化,這是一個痛苦。我有一個調試分支從幹線分叉,然後從調試分支分叉的功能分支。然後,我使用上述命令移動功能部件代碼,試圖查看是否有更簡單的方法。 – 2010-09-17 16:05:36

+0

我已經添加了一個如何將特徵代碼合併到主文件中的示例。現在更清楚了嗎? – 2010-09-21 06:37:47

+0

+1,這是一個很好的技術知道。但是,只要嘗試從'master'合併新的功能,您的調試代碼就會丟失。因此,在將新特性合併到'debug'後,櫻桃選擇你的調試提交回'debug'(即櫻桃採用這種方式)。另外:在進行「假合併」時,請確保合併提交信息反映了這一事實,以保證隊友的健康。 – Nathan 2012-01-30 23:56:40

相關問題