Git:如何总是请求“交互式合并”?

时间:2012-03-16 07:13:09

标签: git merge interactive

我有一个项目有一些脆弱的文件,即使整个程序似乎工作正常,轻微的错误也可能导致安全问题。因此,我希望git始终在合并期间验证任何自动修改的结果。

如果我理解正确,自定义合并驱动程序就是我想要的。我发现最好的方法是在自定义合并驱动程序中使用git-merge-file来获得正常的合并结果,然后只退出1以将结果标记为始终冲突。这样git将在合并期间停止,我可以在完成合并之前检查合并结果。

但是,对该文件的预期更改非常小,最好的方法是运行类似于“git add -i”的东西并选择“patch”并一次应用一个大块。

是否有一种简单的方法可以为该文件的所有合并编写一个行为类似于“git add -i”的合并驱动程序(可能应用的hunk是自动合并的结果)?

此外,如果我已正确理解,将仅针对文件级别冲突调用合并驱动程序。是否可以为特殊标记的文件请求类似的手动验证?我想在进行合并之前在gitattributes中将一个新文件标记为“脆弱”,然后一些git merge magic(或过滤魔法)会请求我验证新的特殊文件对于合并的分支是否正常。

1 个答案:

答案 0 :(得分:0)

我在这里添加我当前的解决方案,因为这比我正在寻找的交互式解决方案更好,但仍然很短。解决方案由三部分组成:

  1. 使用以下内容创建文件bin/merge-and-verify

    #!/bin/bash
    # git merge driver that does normal merge but marks the result as conflicting
    
    # make a copy of original version
    cp "${1}" "${1}.tmp"
    ORIG_HASH=$(git hash-object "${1}")
    WORKFILE=$(git ls-tree -r HEAD | fgrep "$ORIG_HASH" | cut -b54-)
    git merge-file -L "My version (working directory)" -L "Base (common ancestor)" -L "Merge head (remote change)" "${1}" "${2}" "${3}"
    # display changes made
    echo "-----------------------------------------------------"
    echo "Making following changes automatically:"
    echo "(Confirm changes with 'git add $WORKFILE')"
    echo "-----------------------------------------------------"
    diff -u --label "Original" "${1}.tmp" --label "Automatically modified" "${1}"
    echo "-------------------------------------------------"
    # remove our extra copy
    rm -f "${1}.tmp"
    exit 1
    
  2. 创建/修改文件`.gitattributes如下:

    [attr]FRAGILE merge=merge-and-verify
    
    relative/path/to/fragile.file FRAGILE
    
  3. 运行以下命令以激活工作目录中的驱动程序

    git config merge.merge-and-verify.driver "./bin/merge-and-verify %A %O %B"
    
  4. 现在对标记为FRAGILE的任何文件的任何修改都将导致通常的自动合并,其中自动合并的结果将显示在控制台中,并提示如何确认更改(git add relative/path/to/fragile.file)变化看起来很健康。如果在合并期间不需要详细输出到控制台,则只需要驱动程序中的git merge-fileexit 1

    缺少部分:由于git内部行为,如果文件历史记录中没有冲突,则不会调用合并驱动程序。例如,如果在合并到FRAGILE的另一个分支中添加了新的master文件,则不会调用合并驱动程序,因为不需要合并任何文件(就git而言,在这种情况下,合并分支只是添加一个不与任何东西冲突的新文件,因此不需要合并驱动程序。)