Dr.*_*tan 5 git project-management git-svn
我正在开发一个项目,我们使用git管理外部libs/headers和qa.以下是每个开发人员的目录结构:
~/dev/proj
~/dev/ext
~/dev/qa
Run Code Online (Sandbox Code Playgroud)
proj,ext和qa是不同的 git存储库.在svn下,这些目录的同步很简单:〜/ dev下的单个更新将以递归方式更新所有这些更新.使用git,我们需要为每个目录单独执行'git pull'.这不好; 有人会忘记更新(git pull)其中一个目录,他的项目将不同步(例如新的qa不会传递旧代码).我查看了'git submodules'并且没有为'git pull'提供单点同时更新这三个单独的模块[更正:我在这里错了,但请阅读下面的答案].
您可以争辩说我们应该将proj,ext和qa放在同一个git存储库中,但我认为这可能违背了将不同的概念保存在不同存储库中的git哲学.
有没有人有一个解决方案(除了编写一个脚本来对〜/ dev下的每个目录执行git pull)这个琐碎的问题?
谢谢,
俺答
博士先生,
您正在将苹果与橙子进行比较。git-submodules 类似于svn:externals,又名 svn-submodules 。事实上,当您使用-r附加特定版本的 svn 子模块时,行为几乎相同。要使用 svn-submodules 提交,您必须分别在每个子模块目录中提交,就像使用 git-submodules 一样。
但有一个很大的区别:大多数开发人员,至少在开发的某个阶段,更喜欢附加到每个子模块的一个分支,而 git-submodules 不支持这一点。这对于协调发展很有用。(Google 的Repo工具是Git 的包装器,旨在与代码审查工具Gerrit一起使用,有点类似。但是相信我:远离Repo。它解决了不同的问题。)最大的缺点是您无法恢复代码库的精确轮廓。暂时看来还不错,但我听说过一些令人讨厌的战争故事。
您的替代方案不是Subversion,而只是一个存储库,可以位于Git、Subversion或其他任何位置。但您实际上想要单个存储库和多个存储库的组合,对吧?您想要两者的好处。因此,您需要更复杂的解决方案。
一种想法是拥有一个项目存储库(您可以在其中进行大部分开发)以及几个单独的存储库(可以从中分发模块):
proj/.git
proj/subA
proj/subB
subA/.git
subB/.git
Run Code Online (Sandbox Code Playgroud)
您可以使用rsync在它们之间移动代码。美妙之处在于您对开发和分发进行了清晰的区分。您可以正常开发大型项目,包括分支、合并等。当您准备好将子目录作为库分发时,您可以准确决定所需的库版本,并将其复制到其自己的存储库中。当你需要合并而不仅仅是复制时,可以使用git 子树合并策略。
还有另一个系统,构建在子树合并策略之上。它称为git-subtrees,它是 git-1.7.11 的一部分。这是对其操作的一个很好的描述。从图片中你可以看到它的时间线看起来很混乱,但从功能上来说它正是你想要的。这是最近的一篇文章,其中有很好的建议。
如果您不介意 git-submodules 的额外“更新”步骤,但您对其处理冲突的方式感到不安,您可以尝试giternal。作者包含了一个脚本来展示其行为与 git-submodules 和braid(用于自动售货子模块,但不合并它们)的比较。
就我个人而言,我喜欢git-slave,它是 git 的一个简单包装。基本上,它将您的gits命令作为git命令应用到您的所有存储库。这其实只是一个方便而已。它非常容易理解,对各个存储库的影响为零,并且非常适合分支切换(git-subtrees 尚不支持)。
| 归档时间: |
|
| 查看次数: |
5160 次 |
| 最近记录: |