【问题标题】:How can always ignore a file while merge合并时如何始终忽略文件
【发布时间】:2013-04-05 10:07:15
【问题描述】:

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

所以,在我合并两个分支之后,每个分支中的文件都与合并前一样。

【问题讨论】:

    标签: git git-branch git-merge ignore


    【解决方案1】:

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

     git config merge.ours.driver true
    

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

    其次,让我们将您的分支机构称为AB

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

    myconfig.conf merge=ours
    

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

    当将 B 合并到 A 时,它将使 git 始终保留 Amyconfig.conf 版本。如果您还需要将 A 合并到 B,请对 B 分支重复相同的步骤。

    【讨论】:

    • 您是说git config --global merge.ours.driver true 吗?
    • 您确定要进行干净合并吗?尝试通过git checkout -f HEAD 丢弃所有更改,然后重新进行合并。
    • @CPJ 你有快进合并吗?请务必使用--no-ff
    • @EdwardThomson 是的,我有快进合并。但我只是希望无论我以何种方式进行合并,都可以忽略该文件。
    • @CPJ 你必须在这种情况下使用--no-ff。快进合并不执行合并;它检测到不需要发生合并并将分支设置为指向另一个提交。没有机会忽略任何事情。
    【解决方案2】:

    要使用下面的钩子,例如

    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,而不是受限客户端之一。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-08
      • 2016-04-04
      • 1970-01-01
      • 2012-11-27
      • 2013-10-04
      • 1970-01-01
      相关资源
      最近更新 更多