具有多个类似项目的修订控制系统(一个为同一产品的每个客户定制)

yan*_*nce 5 git version-control

我有来自不同客户的多个SW项目,我正在实现git版本控制系统,我想知道最好的方法是什么.这些项目类似,最常见的是现有项目,但每个客户都是独一无二的.我会为每个客户创建一个回购,还是我会创建新的分支.

Chr*_*sen 14

这里有任何人都无法用这种有限的信息给你"最好的"方式.

与许多其他分布式版本控制系统的情况一样,关于如何发布项目的决定(单个存储库中的许多分支,或者每个具有一个/几个分支的多个存储库)在很大程度上独立于更多整体历史管理的重要问题(如何处理Git记录的历史).

我首先要集中精力确定需要在项目中共享哪些数据和历史记录.展望未来,历史将不仅包括过去发生的事情,还包括您期望在未来发生的事情.

听起来您可能希望拥有一个在所有项目中通用的基本文件集,然后将一些每个项目文件/更改分层放在基本文件集之上.作为历史图表,它可能如下所示:

        a1--a2--a3    customer-a
       /
o--o--o               base
       \
        b1            customer-b
Run Code Online (Sandbox Code Playgroud)

展望未来,对"基础"进行更改并将它们合并到客户分支中可能已经足够了:

        a1--a2--a3--a4------a5    customer-a
       /           /       /
o--o--o--o--o--o--o--o----o       base
       \           \       \
        b1----------b2--b3--b4    customer-b
Run Code Online (Sandbox Code Playgroud)

或者,您可能希望在基础更改之上"浮动"客户特定的更改,例如git rebase:

Rebase customer changes on top of four new base changes:

         a1--a2--a3
        /           a1'--a2'--a3'    customer-a
       /           /
o--o--o--o--o--o--o                  base
       \           \
        \           b1'              customer-b
         b1

Another change for B, and two more changes in base:

                      a1'--a2'--a3'
                     /
                    /     a1''--a2''-a3''   customer-a
                   /     /
o--o--o--o--o--o--o--o--o                   base
                   \     \
                    \     b1''--b2'         customer-b
                     \
                      b1'--b2
Run Code Online (Sandbox Code Playgroud)

您可以将上述每个标签(base,customer-a,customer-b)解释为分支,但您可以轻松地将每个标签作为单个分支在单独的存储库中发布而不会丢失功能(尽管您可能希望开发并使用具有所有历史记录的工作存储库进行测试.

根据项目/客户安装的性质,项目特定数据甚至可能不必与基本代码/数据相关.如果项目不要求(例如,所有的定制是不存在的基础本身的配置文件来完成的)改变基本的文件,那么你可能会保持一个简单的线性历史(分公司)对每一个项目的与任何一起配置你喜欢的历史(分支/标签)基础文件.然后,对于每个安装,您可以签出基础和项目特定的配置并将其全部设置为运行.

您甚至可以选择保持每个项目的历史完全独立,并根据需要将修补程序应用于各种项目(但这实际上相当于放弃使用强大版本控制系统的大部分好处).您仍然可以在单个存储库中发布这样一组"不相关"的分支(您的发布方式实际上与您管理历史记录的方式无关).

你走哪条路取决于你想要如何管理历史.

  • 您是否希望在历史提示中获得针对客户特定变化的独特组合?
  • 多人可以访问存储库吗?
    • 重写历史记录(例如,使用rebase)对于多个用户来说可能是痛苦的,或者甚至只是单个用户的多个工作存储库.
  • 项目特定的变更和基本代码/数据之间的相互关系如何?
  • 一些项目是否与其他项目密切相关(与大多数变化相关)?
  • 是否有可以帮助管理每个项目历史的工具(StGit,TopGit,Guilt等)?

除了只是纯粹的历史管理,你也必须考虑你的Git服务提供商的能力(例如GitHub上,git.or.cz,定制gitorious/Gitosis的/ ...安装等).如果您有多个开发人员并希望将其限制为在某些项目/客户上工作,则可能必须发布到多个存储库(如果您使用的Git服务不允许每个分支的权限).但历史管理是最好的做法.您可以随时更改发布历史记录的方式,重写已发布的历史记录会更加痛苦.

我建议尽可能多地阅读文档,并让自己做出明智的决定.在Git的用户手册是一个良好的开端.我特别喜欢Git for Computer ScientistsGit从下到上从内到外理解Git.其上的Git的内部牢牢把握确实能帮助你了解双方的(概念),简单(混帐合并)和更复杂(混帐摘樱桃,git的变基[-i])Git命令.