【问题标题】:tell git to use ours merge strategy on specific files告诉 git 在特定文件上使用我们的合并策略
【发布时间】:2012-12-15 03:17:42
【问题描述】:

我的目录结构如下:

/.git
/.git/info/attributes
/MyProject
/MyProject/pom.xml
/MyProject/MyCode.java

我有分支大师和错误修复。在两个分支上 pom.xml 和 MyCode.java 都进行了修改。 我想只为 MyCode.java 合并从 bugfix 到 master 的更改,并保留 pom.xml 文件的主版本。

所以我添加了“/.git/info/attributes”,因为我不想在项目中提交 .gitattributes

$cat .git/info/attributes
pom.xml merge=ours
$git status
# On branch master
nothing to commit (working directory clean)
$git check-attr -a pom.xml
pom.xml: merge: ours

终于解决问题了:

当我这样做时:

$git merge bugfix
Auto-merging MyProject/pom.xml
CONFLICT (content): Merge conflict in MyProject/pom.xml
Automatic merge failed; fix conflicts and then commit the result.

Git 忽略了属性设置。我在这里想念什么?

我不想根据 post 定义“keepMine.sh”

这个post 是我需要的,但是如果我有一个简单的模式,我不喜欢逐个文件去

谢谢!

【问题讨论】:

  • 虽然你是对的,打开这个问题时我没有找到其他问题,但这里的答案要好得多,它简短、清晰、有效,为读者提供更好的服务..跨度>
  • 我同意。但最好将所有好的答案集中在一个地方。如果您觉得其他问题可以有更好的答案,一个选择是给它一个赏金。即使这被标记为重复,它仍然可以帮助人们。被标记为 dup 并不意味着问题没有用,我什至支持你 =)
  • 我看到了这个并尝试了,但这对我不起作用所以请帮助你? marge time 两个文件marge怎么解决?

标签: git git-merge


【解决方案1】:

从我对 git 版本 1.7.1 的测试中,我发现除非需要合并,否则不会执行任何合并驱动程序(无论您在配置中放置了什么,也不管任何 git 属性)。

如果您从“master”分支到您自己的本地分支“bugfix”,然后在您自己的分支中编辑一堆东西,请提交。然后你再次签出“master”分支,然后执行以下操作:

git merge bugfix

您可能希望“merge=ours”属性在这种情况下保护您。不会的!如果自“bugfix”从 master 分支后没有对 master 分支中的特定文件进行编辑,则分支“bugfix”将踩过分支“master”。没有编辑意味着不需要合并,这意味着不要运行合并驱动程序。这似乎是一个常见的问题,git 应该预先定义一个特定的属性,以在所有情况下为文件提供绝对的本地保护,防止外部合并。

FWIW,我读过其他人的意见,即配置文件应该是本地和私有的,根本不检查到 git 中。我认为这有点夸张:当然,我确实想跟踪我的配置文件中的更改。当然,协作工具的想法是我希望能够将我的配置与团队中其他人正在运行的配置进行比较,或者将开发配置与生产配置进行比较。工具的整体理念是帮助您完成工作。

作为一个笨拙的解决方案,我想出的最好的方法是一个配置目录,其中每个配置文件具有不同的名称(即 config/production config/test config/devel_joe config/devel_bill 等等)以及所有这些进入 git。然后在部署时,实际的工作配置文件会从该配置目录中复制出来。我认为这是一种丑陋的方法,因为它与命名分支的想法相去甚远,但至少它是安全的。

【讨论】:

  • sigh 这太令人沮丧了。为什么 .gitattributes 不能支持合并策略而不仅仅是冲突驱动程序? (也许是因为 git 的某些命令不允许指定策略,所以会不一致?)。在任何情况下,有一些进取心的人可以做的一件事是以与“对象/提交注释”的实现方式类似的方式实现“分支注释”,并使用结帐后挂钩将它们填充到结帐时的文件中。它既丑陋又不安全,但这是我在不修改核心 git 的情况下能想到的最好的方法 :(
  • 我看到这个并尝试了,但这对我不起作用所以请帮助你? marge time 两个文件marge怎么解决?
【解决方案2】:
$ git config merge.ours.driver true

甚至

$ git config --global merge.ours.driver true

'ours' 不是内置的合并驱动程序之一,即使你和我都非常清楚它应该做什么,而且当自定义合并驱动程序未定义时,git 似乎不会出错。

(上面的true 只是unix true 命令,它的成功表明它使本地版本看起来正确,在这种情况下不做任何事情。)

【讨论】:

  • 所以基本上,合并策略的 git book 属性示例 [git-scm.com/book/ch7-2.html]just 属性示例,如果不显式打开甚至预打包但不是默认的合并驱动程序,它将无法工作.. 明白了,谢谢!
  • @Barak1731475 我们的不是默认的冲突驱动程序。它只是被设置为 unix 命令true 以指示“保留现有文件”。请参阅 .gitattributes 中有关冲突驱动程序的文档。
  • 我看到这个并尝试了,但这对我不起作用所以请帮助你? marge time 两个文件marge怎么解决?
猜你喜欢
  • 2014-02-14
  • 2013-03-20
  • 2014-06-01
  • 2018-09-08
  • 2018-01-06
  • 2020-11-21
  • 2012-07-05
  • 2019-05-03
  • 2013-10-13
相关资源
最近更新 更多