Ändern Sie den Standard-Branchnamen von Git Init

Ändern Sie den Standard-Branchnamen von Git Init

Ich versuche herauszufinden, wie ich git initeinen anderen Standard-Branch-Namen als masterfür das erste Commit verwenden kann, kann aber keine Git-Konfiguration dafür oder irgendetwas anderes finden, das mir dies ermöglichen würde (z. B. funktionieren Aliase nur für Befehle, nicht für Branch-Namen).

Gibt es eine Möglichkeit, den standardmäßig git initeingerichteten Namen des ersten Zweigs zu ändern?

Antwort1

Ab Git 2.28 (veröffentlicht am 27. Juli 2020)Sie können jetzt den Namen des Zweigs konfigurieren, der beim Initialisieren eines neuen Repositorys erstellt wird:

$ git config --global init.defaultBranch main

Nach dem Festlegen dieser Variable git initwird beim Ausführen ein Repository erstellt, dessen erster Zweig wie folgt aussieht 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)

Versionshinweise:https://lore.kernel.org/git/[email geschützt]/

Antwort2

In Git-Versionen vor 2.28 HEADistfest codiertdeuten auf refs/heads/master.

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

Es gibt also keine Konfigurationseinstellung oder Option, die Sie übergeben können, git initum sie in etwas anderes zu ändern.

WasIstHEADMöglich ist jedoch, das, was direkt danach zeigt, zu ändern git initmit Hilfe vongit symbolic-ref:

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

Dies ändert sich HEADund verweist auf einen (noch nicht vorhandenen) Zweig namens test. Wenn Sie dann Ihr erstes Commit erstellen, wird der Zweig testanstelle von genannt master.

Antwort3

Eine einfache Möglichkeit, den Standard-HEAD zu ändern, besteht darin, einen HEAD im Git-Vorlagenverzeichnis zu erstellen. Konfigurieren Sie zunächst Ihr Vorlagenverzeichnis wie folgt ~/Templates/git.git(oder was auch immer Sie bevorzugen):

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

Erstellen Sie dann die Datei HEADim Vorlagenverzeichnis:

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

Und schon kann es losgehen! Wenn Sie jetzt ausführen git init, erhalten Sie die folgende Meldung:

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

Aus irgendeinem Grund entscheidet Git, ob diese Meldung verwendet wird, basierend auf der Anwesenheit der HEADDatei in .git, anstatt sich darauf zu verlassen, ob sie .giterstellt werden musste oder nicht. Es ist jedoch wirklich egal, welche Meldung angezeigt wird. Aus der Manpage von git-init:

Das Ausführen git initin einem vorhandenen Repository ist sicher. Bereits vorhandene Elemente werden dabei nicht überschrieben. Der Hauptgrund für das erneute Ausführen git initbesteht darin, neu hinzugefügte Vorlagen abzurufen (oder das Repository an einen anderen Ort zu verschieben, falls --separate-git-dirangegeben).

Das heißt, git inites wird garantiert nicht das überschrieben, was HEADSie in die Vorlage eingegeben haben, und es wird auch nicht die Vorlage verwenden, HEADum eine vorhandene zu überschreiben HEAD. Da dies explizit dokumentiert ist, können Sie sich darauf verlassen.

Darüber hinaus heißt es dort auch:

Dateien und Verzeichnisse im Vorlagenverzeichnis, deren Name nicht mit einem Punkt beginnt, werden $GIT_DIRnach der Erstellung in das Verzeichnis kopiert.

Dadurch können Sie sich auch darauf verlassen, dass die Kopie der Vorlage sofort nach der Erstellung erfolgt .gitund nicht erst zu einem späteren Zeitpunkt.

(Das ist natürlich meine persönliche Interpretation des Handbuchs. Es ist durchaus möglich, dass die Git-Entwickler anderer Meinung sind.)

Antwort4

Wie erwähnt ist HEAD fest codiert, um auf Master zu verweisen. Sie können jedoch einen Shell-Alias ​​erstellen, um das zu tun, git initwas Sie möchten. Wenn Sie Bash als Shell verwenden, fügen Sie etwas wie das Folgende in Ihre .bashrc ein:

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

Dadurch wird der Befehl gitdurch eine Funktion ersetzt. Diese Funktion lässt den Befehl gitgenauso ausführen, es sei denn, Sie rufen ihn git initohne weitere Argumente auf. Wenn Sie git initihn aufrufen, wird das Repository initialisiert. Als Nächstes wird geprüft, ob der Zweig „daddy“ bereits vorhanden ist. Wenn dies der Fall ist, wird dieser Zweig ausgecheckt, andernfalls wird der Zweig erstellt und Sie werden dorthin verschoben.

verwandte Informationen