接受主分支名称和主分支名称的 git 别名?

A git alias to accept both main and master branch names?

我从事几个项目,其中一些项目 main 和一些 master 作为默认分支。我无法用一个或另一个名称重命名所有项目,因为并非所有项目都由我管理。我知道 .gitconfig 别名系统非常广泛,所以我想知道是否有办法为涉及的每个命令接受这两个名称。到目前为止,我只找到了 this,但它涉及修改每个单独的命令并使用不是很 'pretty' 的 !sh -c。理想的情况是还测试两个分支是否确实存在于回购协议中以避免错误。
我尝试在 .gitconfig [alias] 部分的开头添加 master = main 但它无法以任何方式工作。

我认为没有可行的方法来做到这一点。您可以通过在本地重命名分支来近似;这不会影响远程或任何其他用户,因此它是否是要管理的“您的”项目并不重要。

git checkout master
git branch -m main

但我真的不推荐它。这样做的缺点(或者你最初的“别名”想法,如果你能让它工作的话)是你可能会加强你对哪个回购使用哪个名称的知识的缺乏。对于需要远程跟踪引用名称(origin/masterorigin/main)的情况,以及与存储库的其他用户通信的情况,这可能会增加混淆。

IMSoP 答案的更可靠版本是

awk -F "/" '{print $NF}' \
  $(find ./.git/refs/remotes/ -type f -name 'HEAD' | head -1)

find 首先是 HEAD,然后是分支名称,而不管遥控器的名称或它们的编号。


编辑:我下面的初始答案比上面的更脆弱。

testing if both branches actually exist in the repo to avoid mistakes.

专门为了切换到默认分支,我在这个…过渡期间使用了这个bash功能。

gsm () {  # Switch to main or master branch
  git branch --list | grep ' master$'
  if   [[ $? -eq 0 ]]; then git switch master
  elif [[ $? -ne 0 ]]; then git branch --list | grep ' main$'
    if [[ $? -eq 0 ]]; then git switch main; fi
  else  # neither exists
    git switch -c main
  fi
}

我还没有针对 master and/or main 存在 and/or 不存在的每个组合进行测试。

要查找远程 存储库的默认 分支,无论名称如何,您都可以查看.git/refs/remote/<remote name>/HEAD

例如:

$ cat .git/refs/remotes/origin/HEAD
ref: refs/remotes/origin/master
$ awk -F "/" '{print $NF}' .git/refs/remotes/origin/HEAD
master

然后可以切换到本地同名分支:

git switch $(awk -F "/" '{print $NF}' .git/refs/remotes/origin/HEAD)

来自 :

git rev-parse --abbrev-ref origin/HEAD will print origin/<default-branch-name>.

从中剥离远程部分(即:“origin”),只打印到 (最后一个)/:

的右边
basename "$(git rev-parse --abbrev-ref origin/HEAD)"

要支持多个遥控器,可以做类似下面的事情(里面 例如脚本或函数):

test -n "" && r="" || r=origin
basename "$(git rev-parse --abbrev-ref "$r"/HEAD)"

现在在一个名为“defbranch”的 git 别名中:

[alias]
    defbranch = "!f() { test -n \"\" && r=\"\" || r=origin; \
      basename \"$(git rev-parse --abbrev-ref \"$r\"/HEAD)\"; }; f"

它应该足够便携,可以在任何 POSIX 兼容的 shell 上工作。

将以上代码添加到您的 git 配置文件(例如:~/.gitconfig)并使用它 像这样:

$ git defbranch
master

要打印另一个远程的默认分支,只需将其名称指定为 第一个参数:

$ git defbranch origin2
main

将别名与其他 git 命令一起使用的示例:

git checkout "$(git defbranch)"
git merge "$(git defbranch)"

为了增加人体工程学,您还可以将默认分支名称存储在 变量,然后只使用变量:

db="$(git defbranch)"
git checkout "$db"
git merge "$db"