Git
如何在 gitconfig 和 shell 腳本中對預設分支進行操作
隨著在許多項目中從
master
作為 git 的預設分支名稱(例如,main
在 GitHub 中)的重大轉變,假設它作為預設名稱的一些腳本和配置將被破壞。例如,如果您設置了別名以節省鍵入一些 git 命令的時間:[alias] com = checkout master rbm = rebase master rbmi = rebase -i master
這同樣適用於 shell 腳本 - 是否有任何等價物
git checkout master
但 master 將是目前儲存庫的任何預設分支?
Git 沒有預設分支的概念。儲存庫可能包含許多獨立的開發線(例如,維護和開發分支),其中沒有一個比其他任何一個都更特別。分支的重要性以及如何合併它們取決於儲存庫的所有者。
你認為的預設分支,在 GitHub 和其他地方,是
HEAD
指向裸儲存庫的分支。您可以通過執行以下命令查看上次更新遙控器時該名稱的名稱:$ git rev-parse --abbrev-ref origin/HEAD origin/master
如果您想知道遠端的最新值並願意發出網路請求,那麼您可以這樣做:
$ git ls-remote --symref origin | head -n1 ref: refs/heads/master HEAD
請注意,此參考不會自動更新;您必須執行
git remote set-head -a origin
以更新它。但是,這並沒有告訴您用作預設分支的本地分支的名稱。例如,上面的命令來自我的 Git 副本,其中預設分支是
master
. 但是,在我的本地機器上,遠端儲存庫的預設分支被拉入的分支被呼叫dev
(這是我首選的預設分支名稱)。如果這就是您想知道的,那麼這可能就是您想要的命令(假設origin
是您的遙控器):$ git config -l | ruby -e ' remote = ARGV[0] head = `git rev-parse --abbrev-ref #{remote}/HEAD`.chomp a = {} while line = $stdin.gets if line =~ /^branch\.(.*)\.remote=(.*)$/ a[$1] ||= [nil, nil] a[$1][0] = $2 elsif line =~ %r[^branch\.(.*)\.merge=refs/heads/(.*)$] a[$1] ||= [nil, nil] a[$1][1] = $2 end end puts a.map { |k, (a, b)| ["#{a}/#{b}", k]}.to_h[head]' origin
由於這是 Ruby,如果你想讓它成為一個單行,你可以用分號代替換行符。如果您更喜歡 Perl,也可以使用它。