jtg*_*ver 17 git ruby-on-rails git-submodules
我们有两个独立的rails_app,foo/并且bar/(有充分理由分开).它们都依赖于common/文件夹中的某些模型等,目前平行于foo和bar.
我们当前的svn设置用于svn:externals共享common/.本周末我们想试试git.经过大量研究,似乎解决这个问题的"犹太教"方法正在使用git submodule.我们得到了分离工作后foo,bar,common到单独的存储库,但后来意识到所有的附加条件:
- 在提交父级之前始终提交子模块.
- 在推送父模板之前始终按下子模块.
- 在提交之前,确保子模块的HEAD指向分支.(如果您是bash用户,我建议使用git-completion将当前分支名称放在提示符中.)
- 切换分支或拉动更改后始终运行'git submodule update'.
所有这些陷阱不是更复杂的是add,commit,push.我们正在寻找更简单的方法来分享commongit.这个家伙似乎已经成功使用git subtree扩展,但是与标准gitand的偏差仍然看起来并不那么简单.
鉴于我们的项目结构,这是我们能做的最好的吗?我对rails插件/引擎知之甚少,但这似乎是一种可能的RoR-ish方式来共享库.
提前致谢.
我认为git子模块系统比svn:externals或符号链接有很大的优势(这也使得它们更难以使用):为每个超级项目版本存储实际的子模块版本.因此,在破坏向后兼容性的子模块中进行更改是非常安全的:可以使用正确的子模块版本检出任何版本的超级项目,因为超级项目将包含对正确子模块代码的引用.您还可以维护子模块的两个分支(例如,v1.0.x和v2.0.x),并在不同项目中使用不同的分支而不会出现问题.
所以我认为使用子模块确实是值得的,即使它们有点复杂.Git 1.7在这方面有一些重大改进,例如git status现在表示子模块中未提交的修改,所以你可能不会忘记先提交子模块.一个好的GUI也可能是一个帮助(我有一个关于这个的小宠物项目,见这里).
如果你真的不想关心子模块版本(你永远不会在公共代码中进行向后不兼容的更改),那么我也建议使用符号链接.虽然提交和获取不会比子模块容易得多......
我倾向于选择符号链接到子模块.
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尊重符号链接并存储目标位置(而不是跟随链接)的事实.
当然,期望是你始终如一地使用相同的目标路径common.我通过不检查符号链接,并在每个项目中添加README.setup文件来解决这个问题,提醒我在初始化时添加必需的符号链接.拥有devsetup.sh这种初始化也很有用.
IMO,这比子模块更好处理.
一个插件是完全可行的方式,如果你最终在两个以上的项目上使用它或对公众有用,可能值得努力使它成为一个宝石.
这是一个很好的资源
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存储库,一个用于foo,一个用于bar,一个用于插件.
然后在每个项目中将数据保存到您将能够完成的任务中
./script/plugin install --force git://github.com/path/to/plugin/repository
保持最新.
祝好运!
- 乔纳森
您可以使用通用代码创建一个存储库并克隆它两次。两个克隆都将成为 foo 和 bar。您仍然可以在两个项目的单独分支中开发通用代码,并将该分支推送到通用代码存储库。要更新项目中的公共代码,您只需将公共分支合并到 foo 和 bar 的主分支中。
更新:您可以将其想象为具有三个分支的单个存储库:common、foo 和 bar。您将在公共分支中拥有公共代码,并将项目特定代码仅添加到 foo 或 bar 分支。现在,您可以将此存储库克隆为 foo 和 bar 两次,并从它们中删除一个分支(来自 bar 存储库的分支 foo 和来自 foo 存储库的分支 bar)。然后,您将从第一个存储库中删除 foo 和 bar。这将成为公共存储库。最终结果将与上面相同。
| 归档时间: |
|
| 查看次数: |
2972 次 |
| 最近记录: |