Ich versuche herauszufinden, wie ich git init
einen anderen Standard-Branch-Namen als master
fü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 init
eingerichteten 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 init
wird 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 HEAD
istfest 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 init
um sie in etwas anderes zu ändern.
WasIstHEAD
Möglich ist jedoch, das, was direkt danach zeigt, zu ändern git init
mit Hilfe vongit symbolic-ref
:
$ git init
$ git symbolic-ref HEAD refs/heads/test
Dies ändert sich HEAD
und verweist auf einen (noch nicht vorhandenen) Zweig namens test
. Wenn Sie dann Ihr erstes Commit erstellen, wird der Zweig test
anstelle 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 HEAD
im 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 HEAD
Datei in .git
, anstatt sich darauf zu verlassen, ob sie .git
erstellt werden musste oder nicht. Es ist jedoch wirklich egal, welche Meldung angezeigt wird. Aus der Manpage von git-init:
Das Ausführen
git init
in einem vorhandenen Repository ist sicher. Bereits vorhandene Elemente werden dabei nicht überschrieben. Der Hauptgrund für das erneute Ausführengit init
besteht darin, neu hinzugefügte Vorlagen abzurufen (oder das Repository an einen anderen Ort zu verschieben, falls--separate-git-dir
angegeben).
Das heißt, git init
es wird garantiert nicht das überschrieben, was HEAD
Sie in die Vorlage eingegeben haben, und es wird auch nicht die Vorlage verwenden, HEAD
um 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_DIR
nach der Erstellung in das Verzeichnis kopiert.
Dadurch können Sie sich auch darauf verlassen, dass die Kopie der Vorlage sofort nach der Erstellung erfolgt .git
und 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 init
was 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 git
durch eine Funktion ersetzt. Diese Funktion lässt den Befehl git
genauso ausführen, es sei denn, Sie rufen ihn git init
ohne weitere Argumente auf. Wenn Sie git init
ihn 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.