Git:如何维护一个项目的两个分支并仅合并共享数据?

3
假设我有一个项目IMClient-MacOS和IMClient-Windows的两个分支,它们的代码只有一个目录main/不同。所有其他目录都包含系统独立的代码,并且可以互换。
一些工人在Windows版本上工作,另一些工人在MacOS版本上工作。当他们从对方的分支合并时,如何防止覆盖更改到main/目录中?是否有一种在Git中合并的方法,总是忽略与操作系统相关的目录?
4个回答

7

你可能可以使用git来解决问题,但是如果将系统相关的代码放在不同的目录中,并在构建系统(Makefiles或其他工具)中处理跨平台依赖关系,那么你的生活将会变得更加简单。难道有什么好的理由让来自不同系统的代码共享同一个目录吗?


你可以使用 git 中的 cherry picking 来完成这个操作,但是这会让开发人员需要密切关注彼此的分支。这种替代方案更好,即尽可能将系统相关代码保持分离(放在单独的目录、命名空间、开关等中),然后让自动构建来完成其余工作。 - Spoike
1
在Git中,代码是否共享同一目录并不重要。如果您使用SVN,这是一个很好的答案。请参阅gitster的回答。 - Paul
尽管Gitster的回答很好,但Norman并不是像在SVN中那样使用文件夹作为分支,@Paul。这只是在GIT项目内部构建文件夹以分离Jake想要的内容,而不是使用分支。对于Jake的用途来说是有意义的。 - cregox

6
不要只使用每个平台(Windows和Mac)一个分支。
相反,至少有三个分支:通用、Windows和Mac。通用分支没有任何系统相关代码,平台分支没有任何通用代码,因此没有一个分支可以单独构建。相反,Mac开发人员总是创建一个丢弃的分支,它是通用和Mac之间合并的结果,以便进行构建。
然后,在通用分支上开发和提交通用功能,并在平台分支上附带相关的平台支持代码。
更好的方法是拥有一个单一的代码库,通过构建系统(makefile变量和条件编译)可以在两个平台上构建。然后,Mac开发人员将为新功能仅为Mac添加通用功能和平台支持代码,并为其他平台添加非工作存根,然后将结果交给其他平台的开发人员填写存根。

没错!按照这些方式构建代码库支持不同团队在项目上进行合作,而不会互相干扰彼此的代码。 - Paul

2

尝试过滤合并的替代方法是将公共部分和特定于操作系统的部分拆分为两个存储库。然后,您可以将一个设置为另一个的子模块。将公共部分设置为操作系统特定部分的子模块,还是反之,取决于大多数提交放在哪里。


1

有一个选项可以忽略整个文件或目录结构,但那些文件将根本不会添加到仓库中。我认为您已经知道了,通过使用.gitignore文件。

我认为应该为Windows和OS X的代码分别建立一个单独的分支,就像您所说的那样。然后,您将通过从其他分支(语法为git cherry-pick refspec)中“挑选”代码来合并更改。然而,这些开发人员应始终关注其他操作系统分支上的“更改”。

我还建议始终为main中的文件进行单独的提交,以便在挑选分支时不会混淆。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接