Git 正在执行合并驱动程序,某些文件没有冲突

Git merge driver is beeing executed without a conflict on some files

我们的自定义合并驱动程序有时会在不冲突的文件上执行(如果您删除合并驱动程序,它们不会有任何冲突,因此在合并驱动程序中您可以只执行 git 合并文件,一切正常。

我们正在使用 Git 2.5.1

我对 Git 合并驱动程序的看法是它们仅针对冲突文件执行?

.git属性:

* merge=keeplocalversion

.git配置条目:

[merge "keeplocalversion"]
        name = "Keep local pom version"
        driver = /home/atlstash/pommergetreiber/pommergedriver.sh %A %B %O %P

pommergedriver.sh:

#!/bin/bash
echo "==== STARTING MERGE DRIVER ===="

echo 
echo 
echo 
echo 

# CURRENT = destination branch (checked out branch)
CURRENT=
# OTHER = source branch
OTHER=
# ANCESTOR = common parent commit
ANCESTOR=

FULL_BRANCH_NAME="$(git symbolic-ref HEAD )"
if [ "$?" -ne "0" ]; then
        echo "Detecting branch name failed!"
        exit 1
fi
DESTINATION_BRANCH="$(echo $FULL_BRANCH_NAME | sed 's%refs/heads/%%')"
if [ "$?" -ne "0" ]; then
        echo "Transforming destination branch failed!"
        exit 1
fi

DESTINATION_BRANCH="$(echo $FULL_BRANCH_NAME | sed 's%refs/heads/%%')"
git merge-file --diff3 --marker-size=25 -L $DESTINATION_BRANCH -L "COMMON BASE" -L "SOURCE BRANCH" "${CURRENT}" "${ANCESTOR}" "${OTHER}"

是什么导致了以下行为:

<stash>@<machine>:<project>> git merge origin/feature/<branch>
==== STARTING MERGE DRIVER ====
.merge_file_bm9SCU
.merge_file_MU9B7n
.merge_file_IsOa8q
<project>/...BusinessLogicPositionImpl.java
==== STARTING MERGE DRIVER ====
.merge_file_RjSwel
.merge_file_WvT0MO
.merge_file_baS3FR
<project>/...AbstimmungRestServiceImpl.java
==== STARTING MERGE DRIVER ====
.merge_file_ZWlr2L
.merge_file_22faFf
.merge_file_14SIpi
<project>/...AbstimmungRestService.java
==== STARTING MERGE DRIVER ====
.merge_file_yd2o1c
.merge_file_zf9wHG
.merge_file_5UohlJ
<project>/...WPDAbstimmposten.java
Auto-merging <project>/...BusinessLogicPositionImpl.java
CONFLICT (content): Merge conflict in <project>/...BusinessLogicPositionImpl.java
Auto-merging <project>/...AbstimmungRestServiceImpl.java
CONFLICT (content): Merge conflict in <project>/...AbstimmungRestServiceImpl.java
Auto-merging <project>/...AbstimmungRestService.java
Auto-merging <project>/...WPDAbstimmposten.java
Automatic merge failed; fix conflicts and then commit the result.

两个冲突的文件有真正的冲突,两个合并的文件没有。

为什么要为这两个文件执行合并驱动程序?

只要需要 3 路合并,自定义合并驱动程序就是 运行,即无论何时自合并基础以来两个合并父项中的文件都已更改。如果您只想 运行 您的逻辑以防发生冲突,您可以调用 git merge-file -p 并且(如果退出代码为 0)用结果覆盖 $1 或(如果退出代码不为 0)运行 你的特殊冲突解决逻辑。