Wie kann ich ein Git-Repository mit einem anderen Standardzweignamen als "master" erstellen?

85

Im Pro Git-Buch heißt es

"Herkunft" ist nichts Besonderes

So wie der Filialname "master" in Git keine besondere Bedeutung hat, hat auch "origin" keine besondere Bedeutung. Während "master" der Standardname für einen Startzweig ist, wenn Sie git init ausführen, was der einzige Grund ist, warum er häufig verwendet wird , ist "origin" der Standardname für eine Fernbedienung, wenn Sie git clone ausführen. Wenn Sie stattdessen git clone -o booyah ausführen, haben Sie booyah / master als Standard-Remote-Zweig.

Das heißt, wir können unseren Standardzweignamen als Haupt- oder Hauptzweig oder ähnliches verwenden. Ich habe keine Option gesehen, bei man git-initder meine repomit einem anderen Standardzweignamen initialisiert wird .

GitHub zeigt auf seiner Einstellungsseite , wie der Standardzweignname festgelegt wird . Aber ich spreche nicht darüber, wie man es auf einer bestimmten Git-Hosting-Site einstellt . Ich frage nur in Bezug auf Git, nicht in Bezug auf eine bestimmte Git-Hosting-Site .

Gibt es eine Möglichkeit, das zu tun?

Abhisek
quelle
1
Es wurde mit einigen Arbeiten begonnen, um die Benennung des Haupt- / Standardzweigs in github.com/git-for-windows/git/issues/2674 zu untersuchen .
Philip Oakley

Antworten:

79

Neueres Git, neues Repo

Seit Git Version 2.28.0 nimmt der git initBefehl jetzt einen --initial-branch(oder -bkurz) Parameter an. Diese beiden Befehle erstellen ein neues Git-Repo mit einem Zweig namens "trunk", was für mich immer sinnvoller war als "master" (master of what?):

git init --initial-branch=trunk
git init -b trunk

Dies ist mit der init.defaultBranchEinstellung konfigurierbar . Wenn ich möchte, dass alle neuen Repos "Trunk" als Standardzweig haben:

git config --global init.defaultBranch trunk

Älterer Git, New Repo

Einige Systeme haben noch ältere Git-Installationen. Mein Debian 10-Server (Buster, die aktuelle stabile Version ab Oktober 2020) wird mit Git 2.20 geliefert, das diese -bOption nicht unterstützt . Eine Möglichkeit besteht darin, das Repository zu erstellen und dann den Filialnamen zu ändern. Diese Technik funktioniert für normale (nicht nackte) Repos:

git init
git checkout -b trunk

Dadurch wird ein neues Repository mit trunkdem aktuellen Zweig anstelle von erstellt master. Der Zweig masterexistiert nicht wirklich - die Zweige werden erst erstellt, wenn sie mindestens ein Commit haben. Bis der Zweig erstellt wird, existiert der Zweig nur in .git/HEAD, was erklärt, warum der masterZweig verschwindet, wenn Sie zu wechseln trunk.

Nackte Repos

Für nackte Repos können Sie nicht laufen git checkout(das bedeutet, nackt zu sein). Stattdessen können Sie HEAD so ändern, dass es auf einen anderen Zweig zeigt:

git init --bare
git symbolic-ref HEAD refs/heads/trunk

Alte Repos

Wenn Sie sich bereits verpflichtet haben, können Sie git branch -mstattdessen Folgendes ausführen :

git init
touch file.txt
git add file.txt
git commit -m 'commit 1'
git branch -m trunk

Dadurch wird der Zweig von masternach trunkseiner Erstellung in umbenannt.

Dies scheint etwas umständlich zu sein, da der Mechanismus unterschiedlich ist, je nachdem, ob das Repository leer ist, aber es funktioniert. Sie können es auch als "Erstellen eines neuen Zweigs und Löschen master" betrachten.

Dietrich Epp
quelle
Im ersten Fall beim Ausführen git checkout -b trunk. Bedeutet das, dass von da an der Standardzweig Trunk ist?
Abhisek
2
"Standard" ist eine Fehlbezeichnung. "Aktueller Zweig" ist wirklich das, was hier los ist.
Dietrich Epp
help.github.com/articles/setting-the-default-branch spricht über den Standardzweig, daher war ich wenig verwirrt. Ich habe ein bisschen experimentiert, was du gesagt hast. Es stellt sich heraus, dass es in git nichts wie "Standard" gibt. danke
Abhisek
4
Das sieht aus wie ein GitHub-Konzept, kein Git-Konzept. Es geht um Pull-Anfragen, und in Git gibt es keine "Pull-Anfrage".
Dietrich Epp
Ich habe gerade nach so etwas gesucht
Wexoni
91

Sie können indirekt konfigurieren git init, dass ein anderer Standardzweig verwendet wird: Der aktuelle Zweig wird definiert durch. HEADDies ist „nur“ eine Textdatei, die Git mitteilt, welche Referenz die aktuelle ist.

Mit init.templateDirkönnen Sie git initnach einem anderen fragen :

# ~/.config/git/config or ~/.gitconfig
[init]
    templateDir = ~/.config/git/template/

und in ~/.config/git/template/HEAD, setzen Sie eine einzelne Zeile (+ Zeilenumbruch): ref: refs/heads/main(standardmäßig zu verzweigen main).

Der gesamte Inhalt von templateDirwird .gitbeim Erstellen eines Repositorys in das Verzeichnis kopiert . Die Standardeinstellung (hier /usr/share/git-core/templates) enthält einige Beispiel-Hooks und andere Dateien. Sie können jedoch Ihr neues Vorlagenverzeichnis verwenden, um beispielsweise Standard-Hooks einzurichten.

$ tree /usr/share/git-core/templates
/usr/share/git-core/templates
├── branches
├── description
├── hooks
│   ├── applypatch-msg.sample
│   ├── commit-msg.sample
│   ├── fsmonitor-watchman.sample
│   ├── post-update.sample
│   ├── pre-applypatch.sample
│   ├── pre-commit.sample
│   ├── prepare-commit-msg.sample
│   ├── pre-push.sample
│   ├── pre-rebase.sample
│   ├── pre-receive.sample
│   └── update.sample
└── info
    └── exclude

3 directories, 13 files
nicoo
quelle
Zu Ihrer Information: Wenn Sie diese Anweisungen unter OSX befolgen, müssen Sie möglicherweise in / usr / local / git / share / git-core / templates nach den Vorlagendateien suchen
Brian Gradin,
1
NB: Sie können auch eine HEADDatei in der Standardvorlage erstellen. Sie erfahren jedoch, dass Sie ein Repository "neu initialisieren", wenn Sie tatsächlich eine erstellen.
Jhpratt
24

Wie kann ich ein Git-Repository mit einem anderen Standardzweignamen als " master" erstellen ?

Sie würden Git 2.28 (Q3 2020) verwenden: Der Name des primären Zweigs in vorhandenen Repositorys und der Standardname für den ersten Zweig in neu erstellten Repositorys werden konfigurierbar gemacht, damit wir uns schließlich vom fest codierten Zweig entwöhnen können. master'.

Und Erinnerung vom August 2020 von GitHub :

Wenn Sie am 1. Oktober 2020 den Standardzweig für neue Repositorys für Ihren Benutzer, Ihre Organisation oder Ihr Unternehmen nicht geändert haben, ändert er sich automatisch von masterzumain .
Sie können diese Änderung jederzeit abbestellen:

  • Für Benutzer auf der Seite https://github.com/settings/repositories
  • Für Organisationsinhaber auf der https://github.com/organizations/YOUR-ORGANIZATION/settings/repository-defaultsSeite
  • Für Unternehmensadministratoren auf der https://github.com/enterprises/YOUR-ENTERPRISE/settings/member_privilegesSeite

Diese Änderung ist eine von vielen Änderungen, die GitHub vornimmt, um Projekte und Betreuer zu unterstützen, die ihren Standardzweig umbenennen möchten.
Weitere Informationen zu den vorgenommenen Änderungen finden Sie unter Github / Umbenennen .

Aber zurück zu Git selbst: (2.28, Q3 2020) Siehe Commit 508fd8e (29. Juni 2020) von Đoàn Trần Công Danh ( sgn) .
Siehe Commit 0068f21 , Commit a471214 , Commit 0cc1b47 , Commit 32ba12d , Commit 6069ecc , Commit f0a96e8 , Commit 4d04658 (24. Juni 2020) und Commit 489947c (23. Juni 2020) von Johannes Schindelin ( dscho) .
Siehe Commit 8747ebb (24. Juni 2020) von Don Goodman-Wilson ( DEGoodmanWilson) .
(Zusammengeführt von Junio ​​C Hamano - gitster- inCommit 11cbda2 , 06. Juli 2020)

init: Ermöglicht die Angabe des ursprünglichen Zweigstellennamens für das neue Repository

Unterzeichnet von: Johannes Schindelin

Es gibt eine wachsende Anzahl von Projekten und Unternehmen, die den Namen der Hauptniederlassung ihrer Repositories ändern möchten ( Hintergrundinformationen hierzu finden Sie beispielsweise in Mislav Marohnićs Tweet ).

Um diesen Zweignamen für neue Repositorys zu ändern, können Sie dies derzeit automatisch tun, indem Sie das gesamte Vorlagenverzeichnis von Git kopieren, den gewünschten Standardzweignamen fest in die .git/HEADDatei codieren und dann so konfigurieren init.templateDir, dass er auf diese kopierten Vorlagendateien verweist.

Um diesen Vorgang weniger umständlich zu gestalten, führen wir eine neue Option ein : --initial-branch=<branch-name>.

git init --initial-branch=hello myLocalRepo
# or
git config --global init.defaultBranch hello
git init myLocalRepo

Und:

init: Ermöglicht das Festlegen des Standardwerts für den anfänglichen Zweignamen über die Konfiguration

Unterstützt von: Johannes Schindelin
Unterstützt von: Derrick Stolee
Unterzeichnet von: Don Goodman-Wilson

Wir haben gerade die Befehlszeilenoption eingeführt --initial-branch=<branch-name>, um die Initialisierung eines neuen Repositorys mit einem anderen Anfangszweig als dem fest codierten zu ermöglichen.

Damit Benutzer den ursprünglichen Zweigstellennamen dauerhafter überschreiben können (dh ohne den Namen für jeden einzelnen manuell angeben zu müssen) git init Aufruf ), führen wir die init.defaultBranchKonfigurationseinstellung ein.

Hinweis: Commit 489947c über die Merge-Commit-Nachricht wurde seitdem in Git 2.29 zurückgesetzt. Siehe " Wie kann ich die Merge-Commit-Nachricht von Git anpassen? ".
Die init.defaultBranchEinstellung bleibt erhalten.


Dies wirkt sich auf Submodule aus:

submodule: Greifen Sie wegen fehlender Fernbedienung auf den Kopf der Fernbedienung zurück

Unterstützt von: Philippe Blain
Unterzeichnet von: Johannes Schindelin

Wenn remote.<name>.branchnicht konfiguriert, wird git submodule updatederzeit auf die Verwendung des Zweignamens zurückgegriffen master.
Eine viel bessere Idee ist jedoch die Verwendung der FernbedienungHEAD : Auf allen Git-Servern, auf denen einigermaßen aktuelle Git-Versionen ausgeführt werden, zeigt das Symref HEADauf den Hauptzweig.

Hinweis: t7419 zeigt, dass es möglicherweise Anwendungsfälle gibt, bei denen erwartet wird , dassgit submodule update --remote Submodule auf den Remote- masterZweig aktualisiert werden, auch wenn der Remote-Zweig vorhanden istHEAD auf einen anderen Zweig verweist.
Dieser Patch macht das Verhalten möglicherweise intuitiver, aber es besteht eine geringe Wahrscheinlichkeit, dass dies zu Regressionen in obskuren Setups führt.

Trotzdem sollte es in Ordnung sein, dieses Verhalten ohne eine längere Übergangszeit zu beheben:

  • Das git submodule update --remote Befehl ist nicht wirklich üblich.
  • Das Verhalten von Current Git beim Ausführen dieses Befehls ist geradezu verwirrend, es sei denn, der aktuelle Zweig des Remote-Repositorys ist master (in diesem Fall stimmt das vorgeschlagene Verhalten mit dem alten Verhalten überein).
  • Wenn ein Benutzer aufgrund des geänderten Verhaltens auf eine Regression stößt, ist die Korrektur tatsächlich trivial: Wenn Sie auf einstellen submodule.<name>.branch, masterwird das alte Verhalten wiederhergestellt.

Beachten Sie, dass mit Git 2.29 (Q4 2020) die Tests in contrib/an die letzte Änderung von angepasst werden fmt-merge-msg.

Siehe Commit b87528c (03. August 2020) von Emily Shaffer ( nasamuffin) .
(Zusammengeführt von Junio ​​C Hamano - gitster- in Commit 83b8250 , 10. August 2020)

Revert "contrib: subtree: Adjust Test auf Änderung in fmt-merge-msg"

Abgemeldet von: Emily Shaffer

Dadurch wird das Commit 508fd8e8baf3e18ee40b2cf0b8899188a8506d07 zurückgesetzt .

In 6e6029a8 ( fmt-merge-msg: Zusammenführungsziel wieder weglassen lassen) erhalten wir das Verhalten zurück, bei dem Zusammenführungen gegen ' master' standardmäßig kein " into 'master'" am Ende der Zusammenführungsnachricht enthalten. Dieser Testfix wird nicht mehr benötigt.

Ebenfalls:

Aktualisieren Sie mit Git 2.29 (Q4 2020) die Tests, um das Wort ' master' von ihnen zu entfernen .

Siehe Commit f33f2d3 , Commit b6211b8 (26. September 2020) und Commit 432f5e6 , Commit 5a0c32b , Commit 659288c (21. September 2020) von Johannes Schindelin ( dscho) .
(Zusammengeführt von Junio ​​C Hamano - gitster- in Commit 58138d3 , 05. Oktober 2020)

tests: Vermeiden Sie Variationen des masterFilialnamens

Unterzeichnet von: Johannes Schindelin

Der Begriff masterhat eine geladene Geschichte, die als ständige Erinnerung an rassistische Ungerechtigkeit dient. Das Git-Projekt hat keine Lust, dies fortzusetzen, und hat bereits begonnen, es zu vermeiden.

Die Testsuite verwendet Variationen dieses Namens für andere als die Standardzweige. Abgesehen von t3200, wo wir dies gerade im vorherigen Commit angesprochen haben, können diese Instanzen automatisiert umbenannt werden, da sie keine Änderungen außerhalb des Testskripts erfordern. Lassen Sie uns das also tun.

Da die berührten Zweige (wenn überhaupt) sehr wenig mit dem Standardzweig zu tun haben, verwenden wir ein völlig separates Namensschema: topic_<number>( topic-<number>Dies kann nicht daran liegen, dass t5515 die test_oidMaschinerie mit dem Begriff verwendet und diese Maschinerie intern Shell-Variablen verwendet. deren Namen keine Bindestriche enthalten dürfen).

Dieser Trick wurde durch diesen (GNU) sed-Aufruf ausgeführt:

$ sed -i 's/master\([a-z0-9]\)/topic_\1/g' t/t*.sh

Und immer noch mit Git 2.29:

Siehe Commit 538228e , Commit a15ad5d (08. Oktober 2020) von Johannes Schindelin ( dscho) .
(Zusammengeführt von Junio ​​C Hamano - gitster- in Commit 62564ba , 08. Oktober 2020)

t1415: Vermeiden Sie die Verwendung mainals Referenzname

Unterzeichnet von: Johannes Schindelin

Lassen Sie uns in Vorbereitung auf eine Patch-Serie, die das Fallback für init.defaultBranchauf ändert main, mainin diesem Testskript nicht als Referenznamen verwenden.

Andernfalls würde auch der ( Mann ), der diese Schiedsrichter fangen will, unerwartet fangen .git for-each-ref ... | grep mainrefs/heads/main

Da es sich bei den fraglichen Refs um arbeitsbaumlokale handelt (dh jeder Arbeitsbaum hat seinen eigenen, genau wie HEAD) und der Testfall bereits einen sekundären Arbeitsbaum mit dem Namen " second" verwendet, verwenden wir firststattdessen den Namen " " für diese Refs.

Passen Sie dabei die Testtitel an, die von einem "Repo" sprechen, wenn sie stattdessen einen "Arbeitsbaum" bedeuten.

VonC
quelle
15

Seit Git 2.28 (veröffentlicht am 27. Juli 2020) wird eine neue Konfigurationsoption init.defaultBrancheingeführt, um den fest codierten Begriff zu ersetzen master.

Standard bleibt bis master!

Der Benutzer kann den Standardwert der Konfigurationsvariablen überschreiben mit:

$ git config --global init.defaultBranch main

Weitere Informationen finden Sie im Kapitel zu git doc. Einführung in init.defaultBranch

Zerocewl
quelle
Ja, das habe ich in meiner Antwort auf derselben Seite geschrieben. stackoverflow.com/a/62983443/6309
VonC
Und das habe ich unter Bezugnahme auf dieselbe Antwort
geändert