2010-10-01 112 views
2

我一直在使用Git作爲Subversion repo的胖客戶端,這非常棒。我應該遵循一個提交每Trac的票的方法,但我更喜歡有豐富我自己的利益原子提交的歷史,所以我得到了到下面的習慣:Git嫁接危險嗎?

  1. 讓話題分行Trac的門票
  2. 謬以千里,使得多次提交
  3. 上斷開連接頭使用git rebase -i捆綁所有的工作到一個單一的提交(保持特性分支完好)
  4. 使用git svn dcommit承諾SVN
  5. 將功能合併回master,然後合併從trunkmaster(第二步通常是一個空操作,因爲軀幹和特性分支應該匹配)

這在同步保持mastertrunk很好,同時保持所有我想要的歷史。唯一的問題是,Git認爲master永遠比trunk好,因爲據我所知,我從來沒有真正提交過主題分支或master回到trunk--步驟#3失去了變更的祖先,所以所有Git把是trunk本身哼唱和master無論是從它和特性分支合併:

Switched to branch 'master' 
Your branch and 'trunk' have diverged, 
and have 232 and 1 different commit(s) each, respectively. 

現在,我真的不知道這是一個問題。我大多是唯一一個在SVN倉庫中工作的人,所以並不像處理那些可能會讓人困惑的棘手的合併問題。但是,原則上這讓我困擾(我就是這樣)。我希望trunk承諾反映他們的「真實」祖先 - 每一個都是與前一個SVN修訂版合併爲一個父代,而主題分支合併爲另一個。

而且你看,有.git/info/grafts,這似乎正是我想要的。我甚至可以合併trunkmaster作爲快進合併,這在道德上通常是絕對的。但是,雖然結果可能會很好,但似乎很糟糕,特別是因爲它可能不是絕對必要的。

所以我想知道的是,這個想法有什麼危險嗎?如果我說,每次跳舞時都養成製作嫁接的習慣,我是不是要問題?我應該過一下自己嗎? :-)

+1

「我應該遵循每次Trac-ticket的方法」......也許你可以嘗試改變規則,特別是如果你是唯一使用svn回購的人。 – MatrixFrog 2010-12-09 09:40:29

回答

2

老問題,我知道,但是:

我想保持「樹幹」和「主人」之間的區別是讓你的生活比必要的努力。 「master」通常應該指向svn樹的頂部,或者快速修復你將要提交的消息。但是,當你將一系列更改捆綁在一起並提交時,我認爲下一個邏輯步驟是設置一個嫁接,以便您提交的更改是您的svn父級和您曾經使用的主題分支的子級編寫票證的代碼。換句話說,從git的角度來看,你所承諾的改變就是svn樹和你的主題分支的合併 - 它的許多方面就是它的原因。根本不需要創建主題分支的真正git​​合併。

+0

是的,這或多或少正好是我結束工作的方式: - 在這一點上,我必須在.git/info/grafts中有大約20個不同的移植物,而且我沒有任何問題。 (唯一的問題是添加一個新的移植是有點痛苦;我覺得我應該像一個合適的Git用戶一樣寫一個腳本:-)但是我沒有找到時間。) – 2011-03-18 00:14:10

0

我建議你溝svn,因爲你是唯一一個使用它並堅持使用git,但是假設你無論如何都不能這麼做,那麼我建議你不要再對付你的工具,使用通常意義上的git-svn。

請考慮放棄您的本地歷史,以支持您發送給svn的「拋光」歷史記錄。你的本地歷史反映了你自己的工作,這是你還沒準備好向世界展示的工作 - 某些測試用例可能失敗,或者代碼風格可能很醜陋等等。做一個本地提交,擦亮它,測試它,然後把它放到一個很好的小提交上傳到svn服務器。

無論如何,您仍然會在本地使用reflog進行本地更改。如果你真的想保留自己的本地黑客,那麼考慮給它們加上標籤或其他東西,這樣它們就不會混亂你的主分支。