赞
踩
对于配置文件的特定实例,我同意罗恩的回答:
配置对于您的工作区应该是“私有”(因此“忽略”,如在.gitignore档案“)。
您可能有一个配置文件。模板带着标记值在里面,还有一个脚本config.template文件转换为私有(被忽略的)配置文件。
然而,这一具体的评论并没有回答更广泛的一般性问题,即你的问题(!):如何告诉git总是为特定文件上的冲突合并选择本地版本?(对于任何文件或文件组)
这种合并是一种“复制合并”,在这种合并中,每当发生冲突时,您都会复制文件的“我们的”或“他们的”版本。
对于“一个文件”(通常是一个文件,而不是一个“config”文件,因为它是一个糟糕的例子),您可以通过一个通过合并调用的自定义脚本来实现这一点。
Git将调用该脚本,因为您将定义基属性价值,它定义了自定义合并驱动程序.
在本例中,“自定义合并驱动程序”是一个非常简单的脚本,它基本上将保持当前版本不变,因此允许您始终选择本地版本。
让我们在一个简单的场景(在Windows上使用msysgit 1.6.3)中,仅在DOS会话中测试它:cd f:\prog\git\test
mkdir copyMerge\dirWithConflicts
mkdir copyMerge\dirWithCopyMerge
cd copyMerge
git init
Initialized empty Git repository in F:/prog/git/test/copyMerge/.git/
现在,让我们创建两个文件,它们都有冲突,但合并的方式不同。echo a > dirWithConflicts\a.txt
echo b > dirWithCopyMerge\b.txt
git add -A
git commit -m "first commit with 2 directories and 2 files"
[master (root-commit) 0adaf8e] first commit with 2 directories and 2 files
我们将在两个不同的Git分支中在这两个文件的内容中引入一个“冲突”:git checkout -b myBranch
Switched to a new branch 'myBranch'
echo myLineForA >> dirWithConflicts\a.txt
echo myLineForB >> dirWithCopyMerge\b.txt
git add -A
git commit -m "add modification in myBranch"
[myBranch 97eac61] add modification in myBranch
git checkout master
Switched to branch 'master'
git checkout -b hisBranch
Switched to a new branch 'hisBranch'
echo hisLineForA >> dirWithConflicts\a.txt
echo hisLineForB >> dirWithCopyMerge\b.txt
git add -A
git commit -m "add modification in hisBranch"
[hisBranch 658c31c] add modification in hisBranch
现在,让我们尝试在“我的分支”上合并“他的分支”,并:冲突合并的手动解析
除为
dirWithCopyMerge\b.txt我一直想把
我的版本
b.txt.
因为合并发生在MyBranch,我们将切换到它,并添加‘gitattributes将自定义合并行为的指令。git checkout myBranch
Switched to branch 'myBranch'
echo b.txt merge=keepMine > dirWithCopyMerge\.gitattributes
git config merge.keepMine.name "always keep mine during merge"
git config merge.keepMine.driver "keepMine.sh %O %A %B"
git add -A
git commit -m "prepare myBranch with .gitattributes merge strategy"
[myBranch ec202aa] prepare myBranch with .gitattributes merge strategy
我们有一个.gitattributes中定义的文件。dirWithCopyMerge目录(仅在发生合并的分支中定义:myBranch),我们有一个.git\config文件,该文件现在包含合并驱动程序。[merge "keepMine"]
name = always keep mine during merge
driver = keepMine.sh %O %A %B
如果您还没有定义memMine.sh,并且无论如何启动合并,下面就是您得到的结果。git merge hisBranch
sh: keepMine.sh: command not found
fatal: Failed to execute internal merge
git st
# On branch myBranch
# Changed but not updated:
# (use "git add ..." to update what will be committed)
# (use "git checkout -- ..." to discard changes in working directory)
#
# modified: dirWithConflicts/a.txt
#
no changes added to commit (use "git add" and/or "git commit -a")
type dirWithConflicts\a.txt
a
<<<<<<
myLineForA
=======
hisLineForA
>>>>>>> hisBranch:dirWithConflicts/a.txt
这很好:a.txt已准备好进行合并,并在其中存在冲突。
b.txt,因为合并驱动程序应该负责处理它(因为在
.gitattributes(目录中的文件)。
定义keepMine.sh在你的任何地方%PATH%(或$PATH为了我们的Unix朋友。当然,我两者都做:我在VirtualBox会话中有一个Ubuntu会话)
如评论通过艾克兹,并在“合并策略“的一节自定义Git-Git属性,可以用shell命令替换shell脚本。true.git config merge.keepMine.driver true
但是在一般情况下,您可以定义一个脚本文件:
维普米恩.什# I want to keep MY version when there is a conflict
# Nothing to do: %A (the second parameter) already contains my version
# Just indicate the merge has been successfully "resolved" with the exit status
exit 0
(这是一个简单的合并驱动程序;)(在这种情况下,使用true)
(如果您想保留另一个版本,只需在exit 0行:
cp -f $3 $2.
就这样。您的合并驱动程序将始终保留来自另一个分支的版本,覆盖任何本地更改)
现在,让我们从头开始重试合并:git reset --hard
HEAD is now at ec202aa prepare myBranch with .gitattributes merge strategy
git merge hisBranch
Auto-merging dirWithConflicts/a.txt
CONFLICT (content): Merge conflict in dirWithConflicts/a.txt
Auto-merging dirWithCopyMerge/b.txt
Automatic merge failed; fix conflicts and then commit the result.
合并失败.。只适用于.txt.
编辑.txt,并离开“组分支”中的行,然后:git add -A
git commit -m "resolve a.txt by accepting hisBranch version"
[myBranch 77bc81f] resolve a.txt by accepting hisBranch version
让我们检查一下b.txt在这次合并过程中是否被保存下来。type dirWithCopyMerge\b.txt
b
myLineForB
最后一次提交表示满的合并:git show -v 77bc81f5e
commit 77bc81f5ed585f90fc1ca5e2e1ddef24a6913a1d
Merge: ec202aa 658c31c
git merge hisBranch
Already up-to-date.
(以合并开头的行确实证明了
考虑您可以定义、组合和/或覆盖合并驱动程序,如Git将:检查
.gitattributes在目录中
然后它检查
.gitattributes(它位于父目录中),只有在尚未设置的情况下才会设置指令。
最后,它审查了
$GIT_DIR/info/attributes..此文件用于重写树内设置.它会覆盖
所谓“合并”,我指的是“聚合”多个合并驱动程序。
尼克格林尝试,在评论中,以实际组合合并驱动程序:请参见“通过python git驱动程序合并pom".
但是,正如在他的另一个问题,它只在冲突情况下工作(在两个分支中并发修改)。
赞
踩
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。