这里给出了一般答案:How do I make git merge's default be --no-ff --no-commit?
但是如何仅为远程分支强制执行此?有没有办法做到这一点?
答案 0 :(得分:1)
不,或者至少,不是我所知道的;并看到下面的警告:我怀疑你想要做的事情有用得足够有限,你可能会以错误的方式去做。 (见What is the XY problem?)
(在试图使用这个答案之前,我认为VonC's answer to a related question值得一读。)
如果您“手动”进行合并,您可以随时编写自己的脚本来执行此操作。 (这意味着避免git pull
支持git fetch
,例如:运行git fetch
,然后运行do-merge
脚本,无论你怎么称呼它。)
那么:你如何编写一个模仿git merge
的脚本?当然,这取决于你想要的程度。您可以使用git rev-parse --parseopt
为您解析参数(例如,请参阅git-rebase
脚本和git-sh-setup
脚本,两者都位于git-core
目录中,通常/usr/libexec
或/usr/local/libexec
,虽然安装各不相同。)
如果没有 merge.defaultToUpstream
参数,您还必须决定是否使用commit
,以及您希望如何彻底检测正在进行的合并,修改后的工作目录在合并开始之前,依此类推。
在任何情况下,假设您已经准备好运行“真正的”git merge
命令,并且您想要添加--no-ff --no-commit
当前和仅如果(1)脚本的参数没有覆盖它,并且(2)要合并的“提交”,无论是直接给出还是由merge.defaultToUpstream
暗示,都命名为“远程分支”。您如何确定提交 是“远程分支”?
最简单的测试是在其上运行git rev-parse --symbolic-full-name
。如果结果名称以refs/remotes/
开头,则名称为符号,并命名为远程分支:
name_is_remote_branch() {
local full
full=$(git rev-parse --symbolic-full-name $1)
case $full in
refs/remotes/*) return 0;;
*) return 1;;
esac
}
上述shell函数可以用作例如:
if name_is_remote_branch origin/master; then
echo seems to work
else
echo oops
fi
或(更短,仍然只是为了演示):
name_is_remote_branch master || echo ok # master should not be "remote branch"
(换句话说,就像任何“真实命令”一样,函数返回0表示成功/ true,非零表示“失败”/ false,因此boolean_test && if_true
和boolean_test || if_false
是可用的简写。 )
现在你可以使用小shell函数来测试给你的合并脚本的符号引用,当然也提供条件(1)(“脚本的参数不要覆盖”)。
合并实际上是通过提交ID工作的,这是永久性的;但您的自动控制旋钮基于提交名称,这是可更改的。
如果我们将此测试应用于原始SHA-1 ID会怎样?
$ git log -1 --decorate --oneline
676699a (origin/master, master) commit subject here
如果我在其他分支上并运行do-merge 676699a
,那么想要发生什么?请注意,此特定commit-ID有两个标签origin/master
(远程分支)和master
(本地分支)。我没有给出 label 作为参数,但我已经要求合并那个特定的提交。
写的函数说这是不远程分支。 (特别是,git rev-parse --symbolic-full-name
不输出任何内容并退出0,表示成功; case
然后将空字符串与两个glob模式进行比较,只匹配第二个。)
如果您想要其他事情发生,您需要更多行动。您可以为空字符串添加一个案例模式,这是您为任何非符号名称的有效SHA-1获取的“符号全名”。 (这包括甚至不提交的内容,也不能解析提交的内容。)然后,您可以针对这些情况执行任何操作,但是您需要弄清楚它的内容。
请注意,git-sh-setup
脚本有一个函数peel_commitish
,可以帮助解析提交的修订说明符。 (与所有这些情况一样,它使用git rev-parse
结束,这次使用特殊的^0
后缀,这意味着与^{commit}
相同。)
章鱼合并怎么样?
例如,如果我在分支B
并要求合并(按名称)分支feature1
和origin/feature2
,这意味着什么?在默认情况下是否使用--no-ff --no-commit
方面,我是合并远程分支还是本地分支?