简短的故事:我想告诉git在合并时忽略一个目录。我知道git不会那样工作......
长篇故事: 我有一个项目将部署在两个不同的平台上。每个平台都需要对部署代码进行一些调整。
我有两个分支,每个平台一个:PlatformA和PlatformB。这两个分支实际上是相同的。唯一的区别在于几个文件和一个目录需要存在于一个平台上但不存在于另一个平台上。这是场景:
PlatformA branch:
- dir1
- file1
- dir2
- file2
PlatformB branch:
- dir1
-file1
当我在platformA上工作并对file1进行更改时,会出现问题。我希望这些更改也可以在platformB上使用。问题是当我进行合并时,git将dir2和file2添加到platformB。
我还希望能够在platformB上工作并对file1进行更改,并且能够在没有git删除dir2和file2的情况下合并到platformA。
所以问题是: 有没有办法让两个可合并的分支分支? 要么 有一种方法可以告诉git忽略目录/ commit吗?
我试过这个solution,但仅在合并ProjectB-> ProjectA时有效,而不是相反(git将dir2和file2复制到ProjectB上)。
另外,我想我每次都可以挑选,但这看起来很麻烦,容易出错。
提前致谢!
答案 0 :(得分:1)
我建议不要将分支用于特定于平台的文件。重新组织项目,以便所有平台在一个目录树中,并且公共文件只存在一次。
与Linux内核一样 - 它具有arch目录,其中包含特定于平台的代码,而不是一堆分支。
当您需要开发一个比一次提交更大的新功能时会发生什么?您创建分支PlatformA-CoolFeature和PlatformB-CoolFeature?这将是一个合并地狱:)
答案 1 :(得分:0)
这可能不太理想,但这是我用于几个类似项目的方法......例如,引入第三个分支,名为core
。完成您希望在该分支上的两个平台上可用的所有开发,并且仅在特定于平台的分支上执行特定于平台的开发。定期将core
合并到每个平台分支中(但不是另一个方向!)。跟踪要放置哪些更改可能会变得棘手,特别是如果您需要进行特定更改,需要将其拆分为特定于平台且与平台无关的部分,但只要您记得认为它就可以工作关于你在做什么。当你添加更多平台来跟踪...时,它也会很痛苦。
答案 2 :(得分:0)
最熟悉的方法是进行合并--no-commit --no-ff
并撤消任何你不喜欢的通常行为,例如。
git checkout A
git merge --no-commit --no-ff B
git checkout @ dir2 # nope, didn't want dir2 gone
git commit
这可能是最好的,当通常的命令已经做了你想要的除了一些小事情,并且你想要尽可能少地改变。
另一种选择:“what @Messa said”。他建议的设置和他指出linux使用的是每个部署目标的子目录。这可能是最好的,当你有(a)自由设置你的repo设置(b)一个可修改的构建/测试工具包,(c)至少在一定程度上合理地管理作为单个项目的所有东西。这是一个非常常见的情况,对于一个小商店来说,这是我第一个看到的。
但如果那些引起麻烦,或者可能会造成麻烦,我选择的其余选项中唯一一个是分别管理dir1,作为子模块。这带来了管理开销,它远远不是一个“正常工作”的东西,直到你花时间让自己非常困惑,然后找到你的掌握方式(通过破坏几个玩具回购),但是:仪式并不比与孩子过街更难,你只需要学习如何正确行事,它确实提供了一个优势:它实现完全你想要的东西。 / p>
答案 3 :(得分:-1)
我不认为这有一个直接的好的和干净的解决方案,但作为一种解决方法,您可以使用.gitignore文件进行一些实现。如果在.gitignore文件中包含./dir2/*,dir2将永远不会从A到b合并,也不会从B合并到A,但是如果您修改该目录中的文件,这些文件将不会被git跟踪除非你在提交之前手动添加它们 根据您需要执行每个操作的频率(将A / A中的dir2修改为B),一个或其他解决方案可能更合适,但我认为在从一个操作交换到另一个操作时总是需要修改。你可以有一个脚本来修改.gitignore文件,以防你需要在存储库中添加或删除许多目录。