Git 不会自动合并 composer.json 文件。

6
我希望避免git自动合并我的composer.json文件。这样,我就可以在develop分支中拥有一个使用dev-develop包的composer.json文件,而在master分支中只使用dev-master包的composer.json文件。
我可以像这里建议的那样使用两个composer.json文件,但我担心会忘记在master分支的composer.json文件中添加bundle。特别是在自动化任务时,这可能会导致灾难性后果。
因此,我希望git能够执行以下操作之一:
  • 始终在合并composer.json文件时产生冲突,以便在提交到分支之前手动编辑它。
  • 仅基于行数进行合并...因此,如果添加/删除了bundle,则行数会发生变化,然后应该合并、产生冲突或其他操作。如果行的内容发生更改,则可以忽略它...

在编程中,将分支包含进来被认为是一种不好的做法,尤其是没有版本的分支。尽量在能够的情况下包含版本信息。这样可以避免维护两个composer.json版本的需求,因为所需的版本约束对于你的所有分支都是相同的。 - Sven
@thecatontheflat,没有合并冲突,它将顺利合并。这实际上是我的意思:我想强制发生冲突。 - rolandow
@sven 这主要是为了我自己的软件包,使用 satis 进行维护.. 我想在我的暂存服务器上检出开发分支。当一切正常时,我会合并到主分支,并继续在生产环境中发布代码。这有什么不好的呢? - rolandow
2
重新思考您的开发流程。如果您的主要软件的开发分支依赖于每个库也在它们的开发分支中,那么您实际上不能称这些为“独立库”,并且您可能不应该将它们分离到不同的存储库中。另一方面,如果您将您的库视为独立软件,则无需依赖它们位于特定分支中,而只需要有特定版本即可。发布新版本不会影响主要软件(它将继续使用旧版本),除非您有意更新。 - Sven
由于这个评论讨论可能会导致更好的问题描述,如果您能更新您的问题并添加来自您的评论的新闻,即解释您当前的开发过程,那将是非常好的。 - Sven
1个回答

5

虽然我倾向于认为您描述的特定场景可能表明您在开发过程中存在更深层次的问题,但通过在相关文件上设置merge属性,可以很容易地使git实现您要求的功能。这两个值来自git help attributes中的“执行三路合并”部分:

merge未设置

将当前分支中的版本作为暂定的合并结果,并声明该合并有冲突。这适用于没有明确定义的合并语义的二进制文件。

要实现此操作,请执行以下操作:

echo "composer.json -merge" >> .gitattributes

merge=binary

保留你的分支在工作树中的版本,但是让路径保持冲突状态供用户排序。

要实现这一点,请执行以下操作:

echo "composer.json merge=binary" >> .gitattributes

两者行为相同

这些描述并没有清晰地表明它们的行为有何不同,实际测试中,两者都产生了相同的输出:

$ git merge develop
warning: Cannot merge binary files: composer.json (HEAD vs. develop)
Auto-merging composer.json
CONFLICT (content): Merge conflict in composer.json
Automatic merge failed; fix conflicts and then commit the result.

$ git status
On branch attr-test-2
You have unmerged paths.
  (fix conflicts and run "git commit")

Unmerged paths:
  (use "git add <file>..." to mark resolution)

        both modified:      composer.json

no changes added to commit (use "git add" and/or "git commit -a")

因为你想要的语义不一定是声明这个文件是二进制的,而只是告诉git不要自动合并它,所以-merge似乎稍微更可取一些。


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