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を使うこともできます。

おすすめ記事