2010-04-19 34 views
17

我們有兩個獨立的rails_app,foo/bar/(單獨有很好的理由)。他們都依賴於common/文件夾中的某些型號等,目前與foobar平行。在兩個或更多rails應用程序之間共享代碼... git子模塊的替代品?

我們目前的svn設置使用svn:externals來分享common/。這個週末我們想試試git。經過大量研究,似乎解決這個問題的「猶太教」方式是使用git submodule。我們得到了分離foobarcommon到單獨的存儲庫,但後來工作後,實現所有strings attached

  1. 提交父之前,請務必提交的子模塊。
  2. 在推送父項之前,始終推送子模塊。
  3. 確保子模塊的HEAD在提交之前指向分支。 (如果你是bash用戶,我建議使用git-completion將當前分支名稱放入提示符中。)
  4. 切換分支或提交更改後始終運行'git submodule update'。

所有這些陷阱比addcommitpush事情進一步複雜化。我們正在尋找更簡單的方式在git中分享commonThis guy似乎已經成功使用git subtree擴展名,但是偏離標準gitand仍然看起來不那麼簡單。

鑑於我們的項目結構,這是我們能做的最好的嗎?我對軌道插件/引擎不夠了解,但這似乎是一種可能的共享庫的方式。

在此先感謝。

回答

0

您可以使用通用代碼創建存儲庫並將其克隆兩次。這兩個克隆都會變成foo和bar。您仍然可以在兩個項目的獨立分支中開發通用代碼,並將該分支推送到公共代碼存儲庫。要更新項目中的通用代碼,只需將公共分支合併到foo和bar的主分支中即可。

更新:您可以將其想象爲具有三個分支的單個存儲庫:common,foo和bar。您可以在通用分支中使用通用代碼,並將項目特定代碼僅添加到foo或bar分支。現在,您可以將這個存儲庫克隆兩次,如foo和bar,並從它們兩個中刪除一個分支(bar存儲庫中的分支foo和foo存儲庫中的分支條)。然後,您將從第一個存儲庫中刪除foo和bar。這將成爲公共存儲庫。最終結果與上面相同。

5

一個插件是完全可行的,如果你最終在兩個以上的項目中使用它,或者對公衆有用,可能值得努力使它成爲一個寶石。

下面是關於這個問題的

http://nubyonrails.com/articles/the-complete-guide-to-rails-plugins-part-i

更重要的是一個很好的資源...

http://nubyonrails.com/articles/the-complete-guide-to-rails-plugins-part-ii

最後,你將有三個Git倉庫之一,一個用於酒吧和一個用於插件

然後在每個項目中,以保持它高達數據,你將能夠做到

./script/plugin install --force git://github.com/path/to/plugin/repository

保持它高達日期。

祝你好運!

- jonathan

6

我傾向於喜歡符號鏈接子模塊。

1)有foo,bar和公共代碼(common)在3個獨立的回購。

2)在foo的目錄中,在必要時添加符號鏈接到common

 
$ cd foo 
$ ln -s /path/to/common lib/common 

3)檢查鏈接。

 
$ git add lib/common 
$ git commit 

4)重複bar

這利用了以下事實的優點在於git的方面符號鏈接和存儲該目標的位置(相對於以下的鏈接。)

Ofcourse,所述我們期望您能夠始終如一地使用common的相同目標路徑。我通過不檢查符號鏈接來解決此問題,並在每個項目中添加一個README.setup文件,提醒我在初始化時添加必需的符號鏈接。有一個devsetup.sh這樣的初始化在這裏也很有用。

IMO,這比子模塊處理好得多。

8

我認爲git子模塊系統比svn:externals或符號鏈接有很大的優勢(這也使得它們更難使用):每個超級項目版本都存儲實際的子模塊版本。因此,在子模塊中進行更改會降低向後兼容性的安全性:可以使用適當的子模塊版本檢出任何版本的超級項目,因爲超級項目將包含對正確子模塊代碼的引用。您也可以維護子模塊的兩個分支(例如v1.0.x和v2.0.x),並在不同的項目中使用不同的分支而沒有問題。

所以我認爲即使它們有點複雜,使用子模塊也是值得的。 Git 1.7在這方面有一些重大的改進,例如git status現在指出子模塊中未提交的修改,所以你可能不會先忘記提交子模塊。一個好的GUI也可能是一個幫助(我有一個關於此的小型項目,請參閱here)。

如果你真的不想關心子模塊版本(你永遠不會在通用代碼中做出後向不兼容的更改),那麼我還建議使用符號鏈接。雖然提交和提取不會比子模塊容易得多...

0

您可以做的最好的事情是爲您的公共庫或甚至創建一個插件,這樣你就可以有一個很好的方法更新/分發它。

1

如果你正在尋找一個插件,你也應該考慮做一個寶石。他們在使用它們方面非常相似,但寶石往往更容易合作,支持依賴管理,並且更容易與社區共享/分發。

Railscast的瑞恩·貝茨有關於製造寶石,你可以在這裏找到一個偉大的教程視頻:http://railscasts.com/episodes/135-making-a-gem

相關問題