【问题标题】:Git: How to maintain two branches of a project and merge only shared data?Git:如何维护一个项目的两个分支并只合并共享数据?
【发布时间】:2009-01-10 16:05:20
【问题描述】:

假设我有一个项目 IMClient-MacOS 和 IMClient-Windows 的两个分支,并且它们的代码仅相差(假设)一个目录 main/。所有其他目录都包含独立于系统的代码并且可以互换。

有些工作人员在 Windows 版本上工作,有些在 MacOS 版本上工作。当他们从对应的分支合并时,他们如何防止覆盖更改到 main/ 目录?有没有办法在 Git 中合并,总是会忽略依赖于操作系统的目录?

【问题讨论】:

    标签: git merge


    【解决方案1】:

    您可能可以使用git 解决您的问题,但是如果您将系统相关的代码放在不同的 目录中并处理构建中的跨平台依赖关系,您的生活将会变得更加简单系统(Makefile 或任何你使用的东西)。还是我忽略了让来自不同系统的代码共享一个目录的充分理由?

    【讨论】:

    • 您可以在 git 中使用樱桃采摘来执行此操作,但这会使开发人员需要密切关注彼此的分支。这种替代方法更好地保持系统相关代码尽可能独立(放置在单独的目录、命名空间、开关等中)并让自动构建完成其余的工作。
    • 在 Git 中,代码是否共享同一个目录并不重要。如果您使用的是 SVN,这是一个很好的答案。请参阅 gitster 的答案。
    • 虽然 gitster 的回答很好,但 Norman 并没有像在 SVN 中那样谈论使用文件夹作为分支,@Paul。它只是在 GIT 项目中构建文件夹来分隔 Jake 想要的内容,而不是使用分支。对 Jake 的使用很有意义。
    【解决方案2】:

    每个平台(windows 和 mac)不要只使用一个分支。

    相反,至少要有三个分支:Generic、windows 和 mac。通用分支没有任何系统相关代码,平台分支没有任何通用代码,因此没有一个分支将自行构建。相反,mac 开发人员总是会创建一个一次性分支,该分支是 generic 和 mac 之间的合并,以便构建。

    然后,开发通用功能并将其提交到通用分支,并在平台分支上使用相关的平台支持代码。

    最好有一个单一的代码库,可以通过构建系统在两个平台上构建(makefile 变量和条件编译)。然后mac开发者会为新功能添加一个通用特性和平台支持代码,只针对mac,同时为其他平台添加一个非工作存根,并将结果交给其他平台的开发者填写存根。

    【讨论】:

    • 没错!以这些方式构建代码库支持不同团队在项目上进行协作,而无需他们相互踩踏彼此的代码。
    【解决方案3】:

    尝试过滤合并的另一种方法是将通用部分和特定于操作系统的部分拆分为两个存储库。然后,您可以将一个设置为另一个的子模块。是否将公共部分设置为操作系统特定部分的子模块,或者其他方式可能取决于大多数提交的去向。

    【讨论】:

      【解决方案4】:

      有一个选项可以忽略整个文件或目录结构,但是这些文件根本不会被添加到 repo 中。我想你已经知道了,通过使用.gitignore 文件

      正如您所说,我认为 Windows 和 OS X 的代码有一个单独的分支。然后您将通过cherry-picking 合并来自另一个分支的代码的更改(语法为git cherry-pick refspec)但是,这些开发人员应始终注意其他操作系统分支上的“更改”。

      我还建议始终为 main 中的文件单独提交,这样在您挑选分支时就不会混淆。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-04-15
        • 2021-01-18
        • 1970-01-01
        • 2013-11-09
        • 2012-08-23
        • 1970-01-01
        • 2014-09-23
        • 2013-05-23
        相关资源
        最近更新 更多