合并时如何始终忽略文件

时间:2013-04-05 10:07:16

标签: git git-branch git-merge ignore

我的配置文件在两个分支中有所不同。 我希望在每个分支内部跟踪此配置文件,但在合并分支时始终会忽略它。

因此,在我合并两个分支之后,文件在每个分支中保持与合并之前相同。

2 个答案:

答案 0 :(得分:1)

首先,您需要创建ours合并驱动程序,除非您已有。为此,请运行以下命令:

 git config merge.ours.driver true

此驱动程序允许您在合并会话期间更喜欢目标分支的文件版本。

其次,让我们打电话给您的分支AB

在分支A上,在文件目录中,创建一个名为.gitattributes的文件,其中包含以下行:

myconfig.conf merge=ours

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

A合并到myconfig.conf 时,git始终会保留B的{​​{1}}版本。如果您还需要将 A合并到A ,请对B分支执行相同的步骤。

答案 1 :(得分: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)"
    if test ! -z "$protect"; then
        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那么它有其优点。不幸的是,它还不够完整,所以请确保您使用的是the full git thing,而不是其中一个有限的客户。