【发布时间】:2009-01-10 16:05:20
【问题描述】:
假设我有一个项目 IMClient-MacOS 和 IMClient-Windows 的两个分支,并且它们的代码仅相差(假设)一个目录 main/。所有其他目录都包含独立于系统的代码并且可以互换。
有些工作人员在 Windows 版本上工作,有些在 MacOS 版本上工作。当他们从对应的分支合并时,他们如何防止覆盖更改到 main/ 目录?有没有办法在 Git 中合并,总是会忽略依赖于操作系统的目录?
【问题讨论】:
假设我有一个项目 IMClient-MacOS 和 IMClient-Windows 的两个分支,并且它们的代码仅相差(假设)一个目录 main/。所有其他目录都包含独立于系统的代码并且可以互换。
有些工作人员在 Windows 版本上工作,有些在 MacOS 版本上工作。当他们从对应的分支合并时,他们如何防止覆盖更改到 main/ 目录?有没有办法在 Git 中合并,总是会忽略依赖于操作系统的目录?
【问题讨论】:
您可能可以使用git 解决您的问题,但是如果您将系统相关的代码放在不同的 目录中并处理构建中的跨平台依赖关系,您的生活将会变得更加简单系统(Makefile 或任何你使用的东西)。还是我忽略了让来自不同系统的代码共享一个目录的充分理由?
【讨论】:
每个平台(windows 和 mac)不要只使用一个分支。
相反,至少要有三个分支:Generic、windows 和 mac。通用分支没有任何系统相关代码,平台分支没有任何通用代码,因此没有一个分支将自行构建。相反,mac 开发人员总是会创建一个一次性分支,该分支是 generic 和 mac 之间的合并,以便构建。
然后,开发通用功能并将其提交到通用分支,并在平台分支上使用相关的平台支持代码。
最好有一个单一的代码库,可以通过构建系统在两个平台上构建(makefile 变量和条件编译)。然后mac开发者会为新功能添加一个通用特性和平台支持代码,只针对mac,同时为其他平台添加一个非工作存根,并将结果交给其他平台的开发者填写存根。
【讨论】:
尝试过滤合并的另一种方法是将通用部分和特定于操作系统的部分拆分为两个存储库。然后,您可以将一个设置为另一个的子模块。是否将公共部分设置为操作系统特定部分的子模块,或者其他方式可能取决于大多数提交的去向。
【讨论】:
有一个选项可以忽略整个文件或目录结构,但是这些文件根本不会被添加到 repo 中。我想你已经知道了,通过使用.gitignore 文件
正如您所说,我认为 Windows 和 OS X 的代码有一个单独的分支。然后您将通过cherry-picking 合并来自另一个分支的代码的更改(语法为git cherry-pick refspec)但是,这些开发人员应始终注意其他操作系统分支上的“更改”。
我还建议始终为 main 中的文件单独提交,这样在您挑选分支时就不会混淆。
【讨论】: