git-一个存储库,多个客户端,最好没有子模块

git-一个存储库,多个客户端,最好没有子模块,git,Git,问题: 我们为银行开发系统。这些系统(理论上)是高度安全的,几乎总是受到相当激烈的保密协议的保护。因此,虽然各个项目之间存在一些共享代码,但其中许多代码是完全独立的。这就是说,如果一个项目中的代码或文档“泄漏”到另一个由不同客户拥有的项目中,那将是灾难性的。两名客户要求我们将代码推送到他们的回购协议(我们合同要求的一部分)中,这一问题更加严重 迄今为止,我们只是为每个客户使用了完全独立的回购协议。当然,这意味着在某些情况下,我们有相同代码模块的副本;如果更新是在一个回购协议中进行的,而不是分发给

问题: 我们为银行开发系统。这些系统(理论上)是高度安全的,几乎总是受到相当激烈的保密协议的保护。因此,虽然各个项目之间存在一些共享代码,但其中许多代码是完全独立的。这就是说,如果一个项目中的代码或文档“泄漏”到另一个由不同客户拥有的项目中,那将是灾难性的。两名客户要求我们将代码推送到他们的回购协议(我们合同要求的一部分)中,这一问题更加严重

迄今为止,我们只是为每个客户使用了完全独立的回购协议。当然,这意味着在某些情况下,我们有相同代码模块的副本;如果更新是在一个回购协议中进行的,而不是分发给其他回购协议,则更改/修复不可避免地会丢失。如果我们只需要维护一份此类文件的副本就更好了

当然,另一种方法是为每个客户机使用一个分支,但我发现分支之间合并的开销是不受支持的。此外,我还研究了git子模块,但这些子模块似乎过于危险,因为不小心的提交可能会构成项目之间的“中国墙”,合并似乎比仅仅通过分叉项目更加复杂(请参阅)。我讨厌实现开发人员必须记住特定过程的系统,因为当事情匆忙完成时,错误是不可避免的

显然,第一名是拥有一个单一的存储库,但只有特定的目录或文件被上传到特定的远程repo。虽然我理解通过使用每个客户端的.gitignore和单个分支可以在一定程度上实现这一点,但我担心手指问题(如果有人不适当地编辑了.gitignore文件)可能会导致我试图避免的事情

我们几乎所有的开发平台都是基于Linux的,但是一个遗留系统的开发环境只能在Windows XP上运行,并且由于某种原因它不能在Wine下运行(我怀疑它与Java运行时有关,但这是另一天的故事)


我曾考虑过使用rsync或符号链接来共享公共文件,但这似乎很俗气,如果一些白痴更改源模块旧版本上的文件日期,也可能会带来麻烦。目前,我们有太多的个人存储库和重复的模块供我选择,我可以看到这会给我带来麻烦。我认为这肯定是一个相当常见的问题,我确信有人以稳定、平台独立的方式处理了它,不会假设开发人员在提交时从不出错。

我希望:

当然,这意味着在某些情况下,我们有相同的副本 代码模块;如果进行了更新,更改/修复将不可避免地丢失 在一份回购协议中,且未分配给其他回购协议。那会好得多 如果我们只需要保存一份这样的文件就好了

解决方案是维护公共repo(不绑定到任何客户端)以构建库组件。这样,您就可以构建不同版本的库(适当地进行版本控制),不同版本的客户机代码将使用这些库,而不是导入实际的代码

我通常会存储这些库的不同(连续)版本,并在客户机的代码库中指定要使用的库版本。库项目将定义库测试等。通过更改客户端项目中的版本号,您可以指定使用哪个版本的库(例如,带有修复程序的新版本)

显然,第一名应该是拥有一个单一的存储库,但在哪里呢 只有某些目录或文件才会上载到特定的远程服务器 回购

基于上述原因,我认为这是不可伸缩的或不实用的。我认为您最好能够对您的开发进行沙箱处理,并使生成的二进制文件可供下游用户使用。如果我签出一个新的客户机存储库,我不必重建所有依赖的代码,只需下载工件(如果您的存储库支持,还可能下载源代码)


存在各种用于分发二进制部署的解决方案(例如,在Java世界中,请查看及其与Maven buildtool的集成。Nexus/Maven支持下载二进制部署中打包的源代码)

鉴于此,我希望:

当然,这意味着在某些情况下,我们有相同的副本 代码模块;如果进行了更新,更改/修复将不可避免地丢失 在一份回购协议中,且未分配给其他回购协议。那会好得多 如果我们只需要保存一份这样的文件就好了

解决方案是维护公共repo(不绑定到任何客户端)以构建库组件。这样,您就可以构建不同版本的库(适当地进行版本控制),不同版本的客户机代码将使用这些库,而不是导入实际的代码

我通常会存储这些库的不同(连续)版本,并在客户机的代码库中指定要使用的库版本。库项目将定义库测试等。通过更改客户端项目中的版本号,您可以指定使用哪个版本的库(例如,带有修复程序的新版本)

显然,第一名应该是拥有一个单一的存储库,但在哪里呢 只有某些目录或文件才会上载到特定的远程服务器 回购

基于上述原因,我认为这是不可伸缩的或不实用的。我认为您最好能够对您的开发进行沙箱处理,并使生成的二进制文件可供下游用户使用。如果我签出一个新的客户机存储库,我不必重建所有依赖的代码,只需下载工件(一个