【问题标题】:remap git checkout to git checkout -b OR git checkout将 git checkout 重新映射到 git checkout -b 或 git checkout
【发布时间】:2013-08-02 09:35:42
【问题描述】:

如果分支存在,有没有办法将git checkout 别名为git checkout,如果不存在,则将git checkout -b 别名化?

【问题讨论】:

  • 没有。或者,不容易。您当然可以将 checkout 别名为复杂的 shell 函数,但是每次输入错误都会得到一个新分支,从而导致混乱,尤其是在您没有立即注意到的情况下。

标签: git bash shell


【解决方案1】:

这是一种方法。在您的用户 .gitconfig 中设置它:

[alias]
    magic = !sh -c 'git show-ref --verify --quiet refs/heads/\"$1\" && git checkout \"$1\" || git checkout -b \"$1\"' -

用法:git magic <branch name>

它是这样工作的:

  1. show-ref 用于检查分支是否存在。 --verify 标志用于指定确切的路径,因此如果您执行 git show-ref --verify refs/heads/<branch name>,您将只匹配您的 repo 本地的分支,而不是任何远程上具有相同名称的分支:

    通过要求精确的引用路径来启用更严格的引用检查。除了返回错误代码 1 外,如果未指定 --quiet,它还会打印错误消息。

    --quiet 确保您看不到任何您不需要的错误消息:

    不要将任何结果打印到标准输出。当与--verify 结合使用时,它可用于静默检查引用是否存在。

  2. 如果show-ref以代码0退出,则分支存在,执行&&之后的命令,检出分支。否则,show-ref 以非零状态 1 退出,&& 之后的命令不会执行,但|| 之后的命令会执行,它会创建一个具有该名称的新分支并将其签出。

但是,我应该警告,所写的别名不能很好地与分支名称的 msysgit bash 选项卡完成配合,它会导致发生以下错误,我还不确定为什么:

$ git magic fsh.exe": declare: `_git_'git': not a valid identifier

如果您不尝试使用制表符完成分支名称,别名仍然可以正常工作。我发现这个 Stack Overflow 问题和答案可能有助于解决选项卡完成问题,但我不确定:Git aliases - command line autocompletion of branch names

如果您有兴趣了解有关如何将参数传递给 Git 别名的更多信息,请参阅 Linux Kernel Git Wiki 中的 Advanced aliases with arguments

【讨论】:

  • 我现在有点累调试布尔表达式,但是在A && B || C,如果A 计算为1 我相信B 被执行,而如果它计算为@987654344 @ 跳到评估 C,因为已知 A && B 已经是假的。我认为你必须交换你的 BC 语句。
  • @GabrielePetronella 在其他编程语言中,你所说的会是有道理的,但这不是它在 Bash 中的工作方式,而是相反。如果您在 Bash 提示符下测试这些命令,您会发现它按我所说的那样工作。
【解决方案2】:

不,如果您想将命令保留为git checkout,则不是。根据 git-config man page:

为避免在使用脚本时出现混淆和麻烦,隐藏现有 Git 命令的别名将被忽略。

其他解决方案(例如 Cupcake 的解决方案)也可以,但您必须接受别名的新名称。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-04-14
    • 2020-12-02
    • 2012-04-17
    • 2018-11-23
    • 2018-02-15
    • 1970-01-01
    • 2017-03-28
    • 1970-01-01
    相关资源
    最近更新 更多