如何使git merge默认--no-ff仅适用于遥控器?

时间:2014-02-09 18:48:09

标签: git merge

这里给出了一般答案:How do I make git merge's default be --no-ff --no-commit?

但是如何仅为远程分支强制执行此?有没有办法做到这一点?

1 个答案:

答案 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_trueboolean_test || if_false是可用的简写。 )

现在你可以使用小shell函数来测试给你的合并脚本的符号引用,当然也提供条件(1)(“脚本的参数不要覆盖”)。

注意事项

  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}相同。)

  2. 章鱼合并怎么样?

    例如,如果我在分支B并要求合并(按名称)分支feature1origin/feature2,这意味着什么?在默认情况下是否使用--no-ff --no-commit方面,我是合并远程分支还是本地分支?