两个Git存储库共享公共代码

时间:2015-02-06 01:56:00

标签: git

所以我有一个包含客户端部件和服务器部件的项目。我希望客户端和服务器代码位于不同的Git存储库中,以便清楚地分离代码,但是,它们共享一些文件,理想情况下,共享文件在客户端和服务器中始终是相同的。

我应该怎么做?为公共代码建立第三个存储库是否更好?

5 个答案:

答案 0 :(得分:26)

我不会就“你应该怎么做”给出建议。但是我将解释如何将第三个存储库与公共代码集成到其他存储库中:这是git子模块的工作。 git子模块允许您在指定的路径上引用git存储库的快照:

git submodule add git://example.com/repository.git path

然后创建一个提交。现在,path引用了给定存储库的快照。

填充子模块

  1. 执行git submodule init
  2. 执行git submodule update
  3. 每个已配置的子模块都将更新以匹配它应该看起来的状态。

    将子模块更新为以后的提交

    1. 切换到子模块的目录
    2. 执行git pull / git fetch + git checkout将子模块更新为所需的提交/标记
    3. 创建新提交以更新.gitmodules文件
    4. 中的提交

      有关子模块的更多信息,请查看official manual

答案 1 :(得分:10)

如果他们共享共同的代码,我会看到两个明智的选择。将公共代码分离到自己的项目中,或者合并服务器和客户端存储库,以便更容易地协同工作。

分离公共代码是否值得付出额外的努力取决于您。公共代码本身是否有意义,或者只是本产品特有的一系列功能?例如,如果你有一个共同的SSL或日期解析代码,那将是一个很好的分拆项目。或者您可能已经为配置文件解析编写了特殊代码,即使除了您的项目之外没有人会使用它,也可以独立工作。如果你因为两个项目共享公共代码而脱离公共代码,不要打扰它,它将没有自己的方向。将其拆开只会成为服务器和客户团队开发的障碍。

是否应合并客户端和服务器是另一个考虑因素。它还归结为将它们视为单独的产品是否有意义。它们作为单独的产品有用吗?客户端和服务器的不同版本可以一起工作,还是必须是同一版本?不同的人在客户端和服务器上工作吗?你希望将所有内容保存在一个超级存储库中的事实说不。

如果您分成多个存储库(客户端,服务器,相关项目)follow TimWolla's answer

如果您不确定,请将它们全部合并到一个包含server/client/common/顶级目录的存储库中。如果他们的担忧纠缠在一起,就把它们放在一起。这样还可以更轻松地发现和迁移重复的代码。你可以努力解开它们并创造具体的共同点#34;项目,当时应该将它们分解成自己的存储库。

答案 2 :(得分:4)

TL; DR

只需使用Git子模块来保存您的公共代码。这是他们打算用的用例。存在其他选项,但主要用于同一文件系统上的存储库,并且在通过网络克隆时几乎没有优势。

通用代码与相同文件

处理公共代码的正确方法通常是submodulessubtree merging。但是,如果您具有(并且将保持)相同的文件资产,则可以在支持它们的文件系统上使用符号链接。这种方法至少有三个缺点:

  1. 只有一个存储库具有“真实”文件。另一个存储库只包含一个文件的符号链接,该符号链接可能存在于不同的文件系统上,也可能不存在。
  2. Windows系统没有Linux / Unix风格的符号链接,因此互操作性可能是个问题。
  3. 除非您正在处理非常大的二进制blob,否则共享链接的空间节省可能很小,而且不值得付出努力。
  4. 您还可以研究使用alternates在同一文件系统上的存储库之间共享对象。手册说(强调我的):

      

    您可以使用objects / info / alternates或$ GIT_ALTERNATE_OBJECT_DIRECTORIES机制从其他对象库借用对象。具有此类不完整对象库的存储库不适合发布以供使用哑传输,但只要对象/信息/替代点在它借用的对象存储,否则是正常的。

    这种高级用法通常用于加速像Atlassian Stash这样的系统上的分叉,而不是用于共享特定的blob,但是如果你想要处理链锯,那么工具就在那里。

答案 3 :(得分:0)

答案 4 :(得分:0)

使用程序包管理器(例如用于node.js的NPM,取决于您的语言/环境),
将公用文件移到一个包中,
也许添加一个安装后脚本,
并将通用软件包安装在客户端和服务器软件包中