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

Git合并驱动程序在某些文件上执行时没有冲突,git,git-merge,merge-conflict-resolution,Git,Git Merge,Merge Conflict Resolution,有时,我们的自定义合并驱动程序会在没有冲突的文件上执行(如果删除合并驱动程序,它们不会有任何冲突,因此在合并驱动程序中,您只需执行一个git合并文件,一切都很正常) 我们使用的是Git2.5.1 我对Git合并驱动程序的看法是,它们只针对冲突文件执行 .git属性: * merge=keeplocalversion .gitconfig条目: [merge "keeplocalversion"] name = "Keep local pom version" d

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

我们使用的是Git2.5.1

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

.git属性:

* merge=keeplocalversion
.gitconfig条目:

[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 $1
echo $2
echo $3
echo $4

# CURRENT = destination branch (checked out branch)
CURRENT=$1
# OTHER = source branch
OTHER=$2
# ANCESTOR = common parent commit
ANCESTOR=$3

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.
@:>git合并源/功能/
==正在启动合并驱动程序====
.merge_file_bm9SCU
.merge_file_MU9B7n
.merge_file_IsOa8q
/…BusinessLogicPositionImpl.java
==正在启动合并驱动程序====
.合并文件
.merge_file_WvT0MO
.merge_file_baS3FR
/…AbstimungRestServiceImpl.java
==正在启动合并驱动程序====
.merge_file_ZWlr2L
.merge\u文件\u 22faFf
.merge_file_14SIpi
/…ImmungRestService.java
==正在启动合并驱动程序====
.merge_file_yd2o1c
.merge_文件_zf9wHG
.merge_file_5UohlJ
/…wpdasimposten.java
自动合并/…BusinessLogicPositionImpl.java
冲突(内容):合并/…BusinessLogicPositionImpl.java中的冲突
自动合并/…AbstimungRestServiceImpl.java
冲突(内容):合并/…AbstimungRestServiceImpl.java中的冲突
自动合并/…AbstimungRestService.java
自动合并/…wpdasimposten.java
自动合并失败;修复冲突,然后提交结果。
两个冲突的文件有实际冲突,两个合并的文件没有


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

每当需要三方合并时,即自合并基础之后,当两个合并父级中的文件发生更改时,都会运行自定义合并驱动程序。如果您只想在发生冲突时运行逻辑,则可以调用
git merge file-p
,并(如果退出代码为0)用结果覆盖$1,或者(如果退出代码不是0)运行特殊的冲突解决逻辑。

每当需要三方合并时,都会运行自定义合并驱动程序,也就是说,自合并基之后,无论何时合并父级中的文件都发生了更改。如果您只想在发生冲突时运行逻辑,您可以调用
git merge file-p
,然后(如果退出代码为0)用结果覆盖$1,或者(如果退出代码不是0)运行特殊的冲突解决逻辑。

所以这是冲突的定义,这对我来说是误导。我一直认为只有在文件自动合并失败时才会发生冲突。@BlackEye,这个定义是正确的。只是自定义合并驱动程序不仅仅是为了冲突而运行的。在这个例子中,他的驱动程序的命令行是什么样子的
git合并文件-p%A%O%B | | |/home/atlstash/pommergetreeiber/pommergedriver.sh%A%B%O%p来回答我的问题(我想),它看起来像是git合并文件-p%A%O%B>/dev/null&&git合并文件%A%O%B | | |/home/atlstash/pommergetreeiber/pommergedriver.sh%A%B%O%p
会满足我的需求。所以这是冲突的定义,对我来说是误导。我一直认为只有在文件自动合并失败时才会发生冲突。@BlackEye,这个定义是正确的。只是自定义合并驱动程序不仅仅是为了冲突而运行的。在这个例子中,他的驱动程序的命令行是什么样子的
git合并文件-p%A%O%B | | |/home/atlstash/pommergetreeiber/pommergedriver.sh%A%B%O%p
?要回答我的问题(我想),它看起来像是
git合并文件-p%A%A%O%B>/dev/null&&git合并文件%A%O%B | |/home/atlstash/pommergetreeiber/pommergedriver.sh%A%B%O%p