2016-02-18 63 views
0

我們的定製合併驅動程序會不時衝突並執行不衝突的文件(如果您刪除合併驅動程序,則它們沒有任何衝突,因此在合併驅動程序,你可以做一個混帳合併文件,一切都很好)。Git合併驅動程序在某些文件中執行時沒有衝突

我們使用Git 2.5.1

我的Git的感知合併司機是,他們只對有衝突的文件執行?

的.gitattributes:

* 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. 

兩個衝突的文件有實際的衝突,兩個合併的文件沒有。

爲什麼合併驅動程序爲這兩個文件執行beeing?

回答

1

無論何時需要3路合併,即自從合併基礎以來合併父母中的文件都發生更改時,都會運行自定義合併驅動程序。如果您只想在發生衝突時運行邏輯,則可以調用git merge-file -p和(如果退出代碼爲0)用結果覆蓋$ 1或(如果退出代碼不是0),請運行您的特殊衝突解決邏輯。

+0

所以這是一個衝突的定義,這是誤導我。 我一直以爲只有在文件自動合併失敗時纔會發生衝突。 – BlackEye

+1

@BlackEye,那個定義是正確的。只是自定義合併驅動程序不僅僅是爲了衝突而運行。 –