Git

如何在 gitconfig 和 shell 腳本中對預設分支進行操作

  • November 12, 2020

隨著在許多項目中從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,也可以使用它。

引用自:https://unix.stackexchange.com/questions/618700