[英]Alias git branches to replace "master" with "main"
我在一堆不同的 repos 上工作——其中許多使用master
,其中許多使用main
。
我還為 git 命令設置了各種 shell 別名,例如gcm
為git checkout master
。
問題是我不能在master
不存在的 repos 上使用這些別名。 這顯然沒什么大不了的,因為在這種情況下我只需要手動輸入命令,但這有點煩人。
我想知道是否有一種方法可以在 git 中“別名”分支,所以當我說git push origin master
時,它可以自動將其替換為 main。
您可以使用git show-ref -q
檢查分支是否存在:
alias gcm='git show-ref -q --heads main && git checkout main || git checkout master'
您可以編寫 shell function 以返回默認分支名稱:
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
}
您的別名可能是這樣的:
alias gcm='git chheckout $(git config init.defaultBranch || echo master)'
另一個想法是: HEAD
actualle就像一個別名:
> cat .git/HEAD
ref: refs/heads/master
所以也許這個機制也可以重新用於master
/ main
別名。 但是必須在每個存儲庫中設置此別名。 所以我的選擇是 shell 別名。
在具有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
我個人喜歡j6t 的答案,但請注意,當您運行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
(注意:以上內容完全未經測試)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.