簡體   English   中英

別名 git 分支將“master”替換為“main”

[英]Alias git branches to replace "master" with "main"

我在一堆不同的 repos 上工作——其中許多使用master ,其中許多使用main

我還為 git 命令設置了各種 shell 別名,例如gcmgit 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/masterrefs/remotes/origin/main還是其他一些值。

使用該結果,您可以選擇是否使用名稱mainmaster或其他值。

對於源默認分支為的存儲庫,例如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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM