2012-07-18 188 views
42

我正在從SVN轉移到Git的過程中。在SVN中,我在單個SVN存儲庫中有多個eclipse項目,便於瀏覽項目。我將轉向每個eclipse項目擁有一個git存儲庫,但EGit建議不要這樣做。每個Eclipse項目或一個Git倉庫的多個Git倉庫

EGit的指南建議將多個項目放入一個Git存儲庫。

看到類似的問題such as this建議每個存儲庫一個項目。

哪種方法是最佳實踐,人們實施什麼?

回答

43

這取決於這些項目有多密切相關。問自己以下問題:

  • 他們總是需要分支/標記在一起嗎?
  • 你想要提交所有項目,還是隻提交一個項目?
  • 構建系統是在所有這些系統上運行還是在那裏有邊界?

如果你把它們全部放在一起,上面的一些事情會更容易。您只需在一個存儲庫中分支/標記/存儲/提交,而不是分別爲每個存儲庫執行此操作。

但是,如果您需要例如單獨的項目發佈週期,那麼有必要將每個項目放在獨立的存儲庫中。

請注意,您以後可以隨時拆分存儲庫,或將多個存儲庫再次合併爲一個,而不會丟失歷史記錄。

組合比分割有點困難,所以我會先找一個倉庫,看看它是怎麼回事。

+0

你能暗示關於拆分和組合的鏈接(或至少是條款)嗎?例如,通過組合我假設你可能意味着子模塊(或替代品),但也許更多?關於分裂我以前沒有聽說過,所以我很好奇。 – 2012-08-06 11:26:42

+4

通過拆分我的意思是採用一個存儲庫並使用一次性轉換將其拆分爲多個,例如, [git filter-branch --subdirectory-filter](http://git-scm.com/docs/git-filter-branch#_examples)。結合我的意思是採取多個存儲庫,並創建一個新的存儲庫與一個組合的歷史(再次,一次轉換),例如用[stitch-repo腳本](http://search.cpan.org/~book/Git-FastExport-0.07/script/git-stitch-repo)。合併更加困難,因爲單獨的歷史必須一起「編織」。 – robinst 2012-08-06 13:31:10

+0

這個答案真的很有用。我會進一步說,如果你爲一個「工作」做出了多個項目的決定,那麼你也應該爲項目保留不同的週期。否則,只需創建一個項目。因此,創建一個項目,如果將來需要拆分項目,請將其拆分併爲每個項目創建新的存儲庫。由於歸檔原因保留舊的。保持簡單,跟上。 – 2013-09-05 14:32:26

2

如果您將創建多個git存儲庫,可能會更高效。

如果您將創建一個分支,只有項目的文件將被分支,而不是所有的項目。 小項目分析,提交會更快。操作將花費更少的時間。

日誌也會更清晰,如果您有多個git存儲庫,則可以進行更多粒度配置。

17

我爲每個項目使用1個回購。

一些推理:

  • 當你發現後多次提交搞砸了的東西,這是很容易解決的時候,它只是一個項目。試想一下,你已經承諾了另外兩個項目,現在你需要修復你在第三個項目上所做的提交。

  • 正如Fedir所說,你的歷史和日誌更清潔。它只顯示該項目的提交。

  • 它對我的開發流程有更好的效果。我有一個生產主分支,開發分支,以及開發,我創建分支來實現功能(你可以在這裏閱讀更多關於:http://blog.avirtualhome.com/development-workflow-using-git/

  • 當你在一個團隊工作,所以「分享「git回購,團隊成員是否真的需要所有其他項目?

只有幾個想法,但它歸結爲:做什麼適合你。

7

我覺得這個問題與我回答的一個問題有關,我回答的是here。基本上Git的性質在涉及項目/存儲庫時支持非常精細的粒度結構。我已經閱讀並被教導,每個項目一個存儲庫幾乎總是最佳實踐。與其他人所描述的一樣,通過保持項目獨立並獲得很大收益,您幾乎失去了一切。

16

我有多個項目(Eclipse項目),並嘗試了不同的事情,以找出什麼在實際日常開發方面效果最好。這是我發現的,我認爲,如果大多數人能夠跟蹤結果並客觀地分析結果,他們會發現同樣的結果。

總之使用以下規則將提供最好的結果:

  1. 使每個項目組獨立的存儲設備。
  2. 每個項目組由一組彼此緊密連接的項目組成,這些項目應該一起管理,並且不能輕易地彼此分離。
  3. 項目組可以包含一個項目。
  4. 應該檢查一個包含多個項目的項目組,以瞭解它的一些項目是否可以彼此分離,以便將其拆分成較小的項目組,這些項目組仍然包含彼此緊密連接的項目,一起施用,不能輕易地彼此分離。

以下準則解釋這個程序,以確定哪些項目放在同一倉庫的詳細信息:

  1. 如果一個項目沒有緊密連接到任何其他項目(例如,項目可以在沒有打開其他項目的情況下打開,並且在打開項目時沒有其他項目依賴於打開的項目),那麼您應該將其置於其自己的存儲庫中,原因是上述答案中解釋的原因。

  2. 如果一個項目依賴於其他項目或者其他項目依賴於項目,那麼究竟是他們彼此之間的聯繫如何,他們可以如何包裝在一起以及他們如何輕鬆地從每個項目中分離出來其他。

A)例如包含JUnit測試類,測試一個主項目的類別測試項目是其中兩個項目都非常彼此連接的情況下,可以很容易地包裝在一起,並且不能容易地相互解耦。由於下面C部分所述的原因,這些項目應放置在同一個存儲庫中。B)在一個項目依賴另一個項目來提供某種共享資源的情況下,真正歸結爲它們可以一起管理的程度以及它們可以如何輕鬆地彼此分離。例如,如果具有共享資源的項目被許多項目所依賴,那麼它應該放在其自己的存儲庫中,因爲其他不相關的項目會受到共享源代碼項目更改的影響。在這種情況下,共享資源項目應與相關項目分離,而不是直接連接到相關項目。 (例如,最好創建版本化的歸檔文件[例如名稱爲「projectName」.1.0.1.0.jar的Jar文件],並在每個項目中包含這些文件的副本,而不是通過鏈接項目來共享資源一起)

C)如果多個項目連接在一起,可以很容易地一起管理,但不能很容易地彼此分離,那麼這取決於它們彼此之間的緊密連接。 I)如果項目被放入一個存儲庫,那麼每次存在提交時項目將在存儲庫中保持同步,如果項目緊密連接,項目可以成爲真正的救命。但是,這也造成了上述答案中提到的問題。二)如果項目被放入不同的存儲庫,那麼你將不得不小心保持那裏提交的同步,並確保包括某種機制來指出哪些提交屬於同一個同步點(例如,在項目中完成一組提交時,在每個項目的提交中包含相同的同步點號)。

III)所以在這種情況下,它幾乎總是更好的做法是將這些項目集中到一個存儲庫中,以減少人工同步提交時的工作量,並在需要撤銷提交時避免人爲錯誤。將它們放置在不同的存儲庫中的唯一時機是,只有其中一個項目正在定期更換,而其他已連接的項目很少發生更改。