我有一个项目,其中包括客户端和服务器端。为了清晰分离代码,我希望将客户端和服务器端的代码放在不同的Git仓库中。然而,它们共享一些文件,理想情况下,这些共享文件在客户端和服务器端始终保持相同。
那么我该如何处理呢?最好是创建第三个存储库来存放共享代码吗?
我有一个项目,其中包括客户端和服务器端。为了清晰分离代码,我希望将客户端和服务器端的代码放在不同的Git仓库中。然而,它们共享一些文件,理想情况下,这些共享文件在客户端和服务器端始终保持相同。
那么我该如何处理呢?最好是创建第三个存储库来存放共享代码吗?
我不会就“你应该如何处理这个问题”给出建议。但是我将解释如何将第三方代码库与其他代码库集成:这需要使用 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
文件中的提交信息请参阅官方手册以获取有关子模块的更多信息。
如果您打算将项目分成多个存储库(客户端、服务器、相关项目)请参考TimWolla的答案。
如果您不确定,可以将它们全部合并到一个存储库中,使用server/
,client/
和common/
作为顶级目录。如果它们的关注点交织在一起,请将它们放在一起。这也将更容易发现和迁移重复的代码。您可以开始拆分它们并创建具体的“common”项目,在那时它们应该被分离成自己的存储库。
使用Git子模块来保存您的公共代码。这就是它们设计的用例。虽然还有其他选项,但大多数仅适用于在同一文件系统上的存储库,并且在克隆到网络上时几乎没有优势。
通常处理公共代码的正确方法是通过子模块或子树合并。但是,如果您拥有(并将保持)相同的文件资产,则可以利用支持符号链接的文件系统上的符号链接。这种方法至少有三个缺点:
您还可以研究使用可替代项在同一文件系统上的存储库之间共享对象。手册说(重点在我的):
您可以使用objects/info/alternates或$GIT_ALTERNATE_OBJECT_DIRECTORIES机制从其他对象存储中借用对象。具有这种不完整对象存储的存储库不适合发布以供愚蠢传输使用,但只要objects/info/alternates指向它借用的对象存储,就可以正常使用。
这种高级用法通常用于加速类似Atlassian Stash的系统上的分叉,而不是共享特定的二进制文件,但是如果您想要玩弄电锯,则可以使用这些工具。