git initのデフォルトブランチ名を変更する

git initのデフォルトブランチ名を変更する

git init最初のコミット以外のデフォルトのブランチ名を使用する方法を見つけようとしていますmasterが、そのための git 設定や、これを可能にするものが見つかりません (たとえば、エイリアスはコマンドに対してのみ機能し、ブランチ名に対しては機能しません)。

設定されるデフォルトの最初のブランチ名を変更する方法はありますかgit init?

答え1

Git 2.28(2020年7月27日リリース)以降、新しいリポジトリを初期化するときに作成されるブランチの名前を設定できるようになりました:

$ git config --global init.defaultBranch main

この変数を設定した後、 を実行すると、git init初期ブランチが次のリポジトリが生成されますmain

$ git init
Initialised empty Git repository in /home/thomas/test-git-repo/.git/
$ git status
On branch main

No commits yet

nothing to commit (create/copy files and use "git add" to track)

リリースノート:https://lore.kernel.org/git/[メールアドレス]/

答え2

Gitバージョン2.28より前ではHEADハードコードされたを指すrefs/heads/master

if (create_symref("HEAD", "refs/heads/master", NULL) < 0)

git initしたがって、別の設定に変更するために渡すことができる構成設定やオプションはありません。

しかし、次の助けを借りてHEAD、その直後を指すものを変更することは可能ですgit initgit symbolic-ref:

$ git init
$ git symbolic-ref HEAD refs/heads/test

HEADこれは、 と呼ばれる(まだ存在しない)ブランチを指すように変更されます。その後、最初のコミットを作成すると、ではなくtestブランチが呼び出されます。testmaster

答え3

デフォルトの HEAD を変更する簡単な方法は、git テンプレート ディレクトリに HEAD を作成することです。まず、テンプレート ディレクトリを次のように設定します~/Templates/git.git(または任意の設定にします)。

$ git config --global init.templateDir '~/Templates/git.git'
$ cp -r /usr/share/git-core/templates ~/Templates/git.git

HEAD次に、テンプレート ディレクトリにファイルを作成します。

$ echo 'ref: refs/heads/default' > ~/Templates/git.git/HEAD

これで準備完了です。 を実行するたびにgit init、次のメッセージが表示されます。

$ git init
Reinitialized existing Git repository in [...]

何らかの理由で、git は、 を作成する必要があったかどうかではなく、HEAD内のファイルの存在に基づいてこのメッセージを使用するかどうかを決定します。ただし、表示されるメッセージが何であっても問題ではありません。git-init のマニュアル ページから:.git.git

既存のリポジトリで実行するのgit initは安全です。すでに存在するものは上書きされません。再実行の主な理由は、git init新しく追加されたテンプレートを取得することです (または、指定されている場合はリポジトリを別の場所に移動するためです--separate-git-dir)。

つまり、テンプレートに入力したgit initものが上書きされないことが保証されておりHEAD、テンプレートを使用してHEAD既存のものを上書きすることHEADもありません。これは明示的に文書化されているため、信頼できます。

さらに、次のようにも書かれています。

テンプレート ディレクトリ内の、名前がドットで始まらないファイルとディレクトリは、$GIT_DIR作成後に にコピーされます。

つまり、テンプレートは.git、後ではなく、 の作成直後にコピーされることにも依存できます。

(もちろん、これはマニュアルに対する私の個人的な解釈です。git 開発者が同意しない可能性も十分にあります。)

答え4

前述のように、HEAD はマスターを指すようにハードコードされています。ただし、シェル エイリアスを作成して、git init好きなように動作させることができます。シェルとして bash を使用している場合は、.bashrc に次のような内容を入力します。

function git_init_fnc () {
  default_branch="main"
  if [[ $1 == "init" ]] && [[ $# -eq 1 ]];then
      git init
      if [[ ! -z $(git branch -a | grep $default_branch) ]]; then
          git checkout "$default_branch"
      else
          git checkout -b "$default_branch"
      fi
  else
      /usr/bin/git "$@"
  fi
}

alias "git"=git_init_fnc

これにより、コマンドがgit関数に置き換えられます。この関数は 、他の引数なしでgit呼び出した場合を除いて、コマンドをまったく同じように実行します。呼び出すと、リポジトリが初期化されます。次に、ブランチ「daddy」がすでに存在するかどうかを確認します。存在する場合は、そのブランチをチェックアウトし、存在しない場合は、ブランチを作成してそこに移動します。git initgit init

関連情報