所以我有一个包含客户端部件和服务器部件的项目。我希望客户端和服务器代码位于不同的Git存储库中,以便清楚地分离代码,但是,它们共享一些文件,理想情况下,共享文件在客户端和服务器中始终是相同的。
我应该怎么做?为公共代码建立第三个存储库是否更好?
答案 0 :(得分:26)
我不会就“你应该怎么做”给出建议。但是我将解释如何将第三个存储库与公共代码集成到其他存储库中:这是git子模块的工作。 git子模块允许您在指定的路径上引用git存储库的快照:
git submodule add git://example.com/repository.git path
然后创建一个提交。现在,path
引用了给定存储库的快照。
git submodule init
git submodule update
每个已配置的子模块都将更新以匹配它应该看起来的状态。
git pull
/ git fetch
+ git checkout
将子模块更新为所需的提交/标记.gitmodules
文件有关子模块的更多信息,请查看official manual。
答案 1 :(得分:10)
如果他们共享共同的代码,我会看到两个明智的选择。将公共代码分离到自己的项目中,或者合并服务器和客户端存储库,以便更容易地协同工作。
分离公共代码是否值得付出额外的努力取决于您。公共代码本身是否有意义,或者只是本产品特有的一系列功能?例如,如果你有一个共同的SSL或日期解析代码,那将是一个很好的分拆项目。或者您可能已经为配置文件解析编写了特殊代码,即使除了您的项目之外没有人会使用它,也可以独立工作。如果你因为两个项目共享公共代码而脱离公共代码,不要打扰它,它将没有自己的方向。将其拆开只会成为服务器和客户团队开发的障碍。
是否应合并客户端和服务器是另一个考虑因素。它还归结为将它们视为单独的产品是否有意义。它们作为单独的产品有用吗?客户端和服务器的不同版本可以一起工作,还是必须是同一版本?不同的人在客户端和服务器上工作吗?你希望将所有内容保存在一个超级存储库中的事实说不。
如果您分成多个存储库(客户端,服务器,相关项目)follow TimWolla's answer。
如果您不确定,请将它们全部合并到一个包含server/
,client/
和common/
顶级目录的存储库中。如果他们的担忧纠缠在一起,就把它们放在一起。这样还可以更轻松地发现和迁移重复的代码。你可以努力解开它们并创造具体的共同点#34;项目,当时应该将它们分解成自己的存储库。
答案 2 :(得分:4)
只需使用Git子模块来保存您的公共代码。这是他们打算用的用例。存在其他选项,但主要用于同一文件系统上的存储库,并且在通过网络克隆时几乎没有优势。
处理公共代码的正确方法通常是submodules或subtree merging。但是,如果您具有(并且将保持)相同的文件资产,则可以在支持它们的文件系统上使用符号链接。这种方法至少有三个缺点:
您还可以研究使用alternates在同一文件系统上的存储库之间共享对象。手册说(强调我的):
您可以使用objects / info / alternates或$ GIT_ALTERNATE_OBJECT_DIRECTORIES机制从其他对象库借用对象。具有此类不完整对象库的存储库不适合发布以供使用哑传输,但只要对象/信息/替代点在它借用的对象存储,否则是正常的。
这种高级用法通常用于加速像Atlassian Stash这样的系统上的分叉,而不是用于共享特定的blob,但是如果你想要处理链锯,那么工具就在那里。
答案 3 :(得分:0)
使用子模块,子树或子存储库:
https://medium.com/@porteneuve/mastering-git-submodules-34c65e940407
https://medium.com/@porteneuve/mastering-git-subtrees-943d29a798ec
答案 4 :(得分:0)
使用程序包管理器(例如用于node.js的NPM,取决于您的语言/环境),
将公用文件移到一个包中,
也许添加一个安装后脚本,
并将通用软件包安装在客户端和服务器软件包中