如何在合并时始终忽略一个文件

3

我有一个配置文件,在两个分支中是不同的。我希望这个配置文件在每个分支中都被跟踪,但在合并分支时始终被忽略。

因此,在我合并这两个分支之后,该文件在每个分支中仍然保持与合并之前相同的状态。

2个回答

1
首先,如果您还没有创建 ours 合并驱动程序,您需要创建它。要执行此操作,请运行以下命令:
 git config merge.ours.driver true

这个驱动程序将允许您在合并会话期间优先使用目标分支版本的文件。
其次,我们称您的分支为AB
在分支A上,在该文件的目录中,创建一个名为.gitattributes的文件,并在其中添加此行:
myconfig.conf merge=ours

然后添加并提交.gitattributes文件。

这将使得Git在将B合并到A时始终保留A版本的myconfig.conf。如果您还需要将A合并到B,请为B分支重复相同步骤。


你是不是想说 git config --global merge.ours.driver true - codiac
你确定你在执行干净的合并操作吗?尝试通过 git checkout -f HEAD 放弃所有更改,然后重新执行合并。 - shakurov
@CPJ 你有快速合并的方法吗?请务必使用 --no-ff - Edward Thomson
@EdwardThomson 是的,我有快速合并。但是无论我如何合并,我都希望忽略那个文件。 - codiac
@CPJ 在这种情况下,必须使用--no-ff。 快进合并不执行合并操作;它检测到不需要进行合并并将分支设置为指向另一个提交。 没有忽略任何东西的机会。 - Edward Thomson
显示剩余2条评论

1
使用下面的钩子,例如:
echo path/to/protected/file config >> .git/info/attributes
git config --add branch.server1.protect-attr config

属性configprotect-attr分支项是专门为此发明的。
  • .git/hooks/post-merge

    #!/bin/sh
    protect="$(git config --get-all branch."$(git branch|sed -n 's/^\*.//p')".protect-attr)"
    如果测试不为空 "$protect",则执行以下操作:
        git diff --name-only HEAD@{1} HEAD \
        | git check-attr --stdin $protect \
        | sed -n '/: unspecified$/!s,:.*,,p' \
        | sort -u \
        | sed -e 's,^,git checkout HEAD@{1} -- ",' -e 's,$," # protected file changed by merge,'
    fi
    
当合并到配置分支时,会弹出还原命令,当更改被标记为配置的foo或其他文件合并到标记为保护它们的分支中。
$ git merge wip
Updating 9906beb..888556e
Fast-forward
 foo | 1 +
 1 file changed, 1 insertion(+)
git checkout HEAD@{1} -- "foo" # protected file changed by merge

你也可以添加一个|sh -x管道阶段来执行回退操作,甚至可以使用git commit --amend --no-edit进行全自动操作。这基本上是一个入门套件,有关更多信息,请参阅githooksgitattributesgit config手册。

有一个libgit2项目正在以更易嵌入的方式重新实现git,它不是git,但如果您不需要所有git功能,则具有其优点。不幸的是,它还不完整,无法处理此操作,请确保您使用完整的git工具而不是其中的有限客户端。


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