我做了一堆不同的repos --其中许多使用master,很多使用main。
我还为git命令设置了各种shell别名,例如用于gcm的git checkout master。
问题是,在不存在master的情况下,我不能在repos上使用这些别名。这显然不是什么大不了的事,因为在这种情况下,我只需要手动输入命令,但这有点烦人。
我想知道是否有一种方法可以在git中“别名”分支,所以当我说git push origin master时,它可以自动地用main替换它。
发布于 2022-08-05 07:16:30
在有main但没有master的存储库中,最简单的方法是创建指向main的分支别名master。
git symbolic-ref refs/heads/master refs/heads/main这给出了以下分支的列表(例如):
$ git branch -a
* main
master -> main
side现在,每当您的命令引用master时,它们都应用于main。即使您按master,实际的目标也是main
$ git push origin master
Enumerating objects: 5, done.
Counting objects: 100% (5/5), done.
Writing objects: 100% (3/3), 241 bytes | 241.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
To ../gitupstream
f57e131..15c1aad master -> main发布于 2022-08-04 21:44:15
您可以使用git show-ref -q来检查分支是否存在:
alias gcm='git show-ref -q --heads main && git checkout main || git checkout master'您可以编写一个shell函数来返回默认的分支名称:
default_branch_name() {
git show-ref -q --heads main && echo main || echo master
}
alias gcm="git checkout $(default_branch_name)"这可能简化了编写附加别名的工作。
以上只假定主分支有两个可能的名称。当然,您可以查看更多信息:
default_branch_name() {
for name in master trunk main; do
git show-ref -q --heads $name && break
done
echo $name
}发布于 2022-08-05 15:38:36
我个人喜欢j6t's answer,但请注意,当您运行git clone时,原始存储库中的默认分支在映射到远程跟踪名称之后,将成为origin/HEAD符号引用名称。因此,您可以使用git rev-parse --symbolic-full-name refs/remotes/origin/HEAD来发现这是refs/remotes/origin/master、refs/remotes/origin/main还是其他值。
使用该结果,您可以选择是使用名称main或master,还是使用其他值。
对于源的默认分支为develop的存储库,这意味着您可以解析为develop。如果这是你想要的,那很好。
您可以将这些想法结合起来:在git clone之后(可能不是git clone)之后,运行一个脚本来读取:
#! /bin/sh
rhead=$(git rev-parse --symbolic-full-name origin/HEAD) || {
echo "can't figure out default, not creating symbolic name"
exit 1
}
rhead=${rhead#refs/remotes/origin/}
case "$rhead" in
master) ;; # do nothing
*)
git symbolic-ref refs/heads/master "refs/heads/$rhead"
echo "master -> $rhead"
;;
esac
exit 0(注:以上均未经测试)。
https://stackoverflow.com/questions/73242448
复制相似问题