gitconfigとシェルスクリプトでデフォルトのブランチを操作する方法

gitconfigとシェルスクリプトでデフォルトのブランチを操作する方法

master多くのプロジェクト(GitHubなど)でgitのデフォルトブランチ名が大幅に変更されると、mainこれをデフォルトと仮定したいくつかのスクリプトと設定が破損します。たとえば、いくつかのgitコマンドを入力する時間を節約するためにエイリアスを設定する場合:

[alias]
    com = checkout master
    rbm = rebase master
    rbmi = rebase -i master

シェルスクリプトにも同様に適用されます。これに相当するものがありますが、git checkout master現在のリポジトリが何であれ、マスターが基本ブランチである場所はありますか?

答え1

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を好むなら、Perlを使うこともできます。

答え2

基本ブランチを取得するための専用コマンドはありません。ただし、いくつかの回避策を使用すると取得できます。独自のリポジトリを使用している場合は、いつでも同じ名前を選択できます。他の人を使用している場合は、その人にも一種のリモコンがあります。デビッド・ウォルシュ)役立つ:

LC_ALL=C git remote show origin | sed -n '/HEAD branch:/{s/.*: //;p}'

関連情報