Ändern Sie einen Git-Remote-HEAD so, dass er auf etwas anderes als Master verweist

123

Wie setze ich die HEAD-Referenz einer Git-Fernbedienung so, dass sie auf etwas anderes als "master" verweist?

Mein Projekt hat die Richtlinie, keinen "Master" -Zweig zu verwenden (alle Zweige müssen aussagekräftige Namen haben). Darüber hinaus ist das kanonische Master-Repository nur über ssh: // ohne Shell-Zugriff zugänglich (wie GitHub oder Unfuddle).

Mein Problem ist, dass das Remote-Repository immer noch einen HEAD-Verweis auf refs / Heads / Master hat, aber ich brauche ihn, um auf einen anderen Zweig zu verweisen. Dies verursacht zwei Probleme:

  1. Beim Klonen des Repos gibt es dies,

    Warnung: Remote-HEAD bezieht sich auf eine nicht vorhandene Referenz, die nicht ausgecheckt werden kann.

    Das ist verwirrend und unpraktisch.

  2. Der webbasierte Codebrowser hängt von HEAD als Grundlage für das Durchsuchen des Baums ab. Dann muss HEAD auf einen gültigen Zweig verweisen.

JasonSmith
quelle
Nur eine Möglichkeit für die Aufzeichnung hinzugefügt, aber nicht für Ihren Fall geeignet.
VonC
Trick "kein gemeinsamer Vorfahr": interessant. Sie können es als detaillierte Antwort veröffentlichen und als offizielle Antwort auswählen, wenn Sie feststellen, dass es funktioniert.
VonC
12
FWIW, da Sie GitHub in der Frage erwähnt haben - wenn Sie die HEAD-Referenz auf GitHub ändern möchten, gehen Sie einfach zum Bildschirm "Admin" des Repositorys und ändern Sie die Dropdown-Liste "Standardzweig" in den Zweig, auf den HEAD verweisen soll.
Joe
1
Mögliches Duplikat der Erstellung eines symbolischen
Git-Refs

Antworten:

63

Vor einem Jahr gab es auf GitHub fast dieselbe Frage .

Die Idee war, den Hauptzweig umzubenennen:

git branch -m master development
git branch -m published master
git push -f origin master 

Den Meister dazu bringen, das zu haben, was die Leute verwenden sollen, und alle anderen Arbeiten in Zweigen ausführen.

(ein " git-symbolic-ref HEAD refs/head/published" würde nicht an das Remote-Repo weitergegeben)

Dies ähnelt " Wie lösche ich Origin / Master in Git ".


Wie in diesem Thread gesagt : (Hervorhebung von mir)

" git clone" erstellt nur einen einzigen lokalen Zweig.
Zu diesem HEAD refZweck wird das Remote-Repo betrachtet und ein lokaler Zweig mit demselben Namen wie der von ihm referenzierte Remote-Zweig erstellt.

Um das zusammenzufassen, haben Sie Repo A und klonen es:

  • HEAD Verweise refs/heads/master und das existiert
    -> Sie erhalten einen lokalen Zweig namens master, beginnend mit origin / master

  • HEAD-Referenzen refs/heads/anotherBranchund das existiert
    -> Sie erhalten einen lokalen Zweig namensanotherBranch , beginnend mitorigin/anotherBranch

  • HEAD-Referenzen refs/heads/masterund das gibt es nicht
    -> "Git-Klon" beschwert sich

Ich bin mir nicht sicher, ob es eine Möglichkeit gibt, den HEADRef in einem Repo direkt zu ändern .

(Das ist der springende Punkt Ihrer Frage, ich weiß;))


Vielleicht wäre der einzige Weg eine "Veröffentlichung für die Armen" , wo Sie:

 $ git-symbolic-ref HEAD refs/head/published
 $ git-update-server-info
 $ rsync -az .git/* server:/local_path_to/git/myRepo.git/

Dies würde jedoch einen Schreibzugriff auf den Server beinhalten, was nicht immer möglich ist.


Wie ich in " Git: Richtige Methode zum Ändern von Active Branch in einem nackten Repository?" " , git remote set-headwürde sich am Remote-Repo nichts ändern.

Es würde nur den Remote-Tracking-Zweig ändern, der lokal in Ihrem lokalen Repo gespeichert ist remotes/<name>/HEAD.

VonC
quelle
Danke, VonC. Ich habe das gelesen, bevor ich hier gepostet habe. Wie Sie jedoch sehen können, ist ein Zweig namens "Master" in diesem Projekt aus technischen und politischen Gründen nicht erwünscht.
JasonSmith
Sie können diese Richtlinie dann durchsetzen, indem Sie Aktualisierungen für den Hauptzweig über einen Pre-Commit-Hook nicht zulassen.
VonC
Ja, wenn sich herausstellt, dass es keine Möglichkeit gibt, das zu tun, was ich will, werde ich genau das tun und Ihre Antwort akzeptieren. Vielen Dank für das Follow-up!
JasonSmith
Danke für das Update. Im Moment habe ich den Trick "Kein gemeinsamer Vorfahr" verwendet, um einen Hauptzweig mit nur einem Commit zu erstellen. (Dh: Git-Zweig -D-Master; Echo-Ref: Refs / Heads / Master> .git / HEAD; rm *). Dann habe ich gerade eine Datei namens GO_AWAY berührt und eine Commit-Nachricht erklärt die Situation. Das wird vorerst funktionieren. Ich kann die Quelle durchsehen und herausfinden, wo die empfangende Seite HEAD für eine endgültige Antwort einstellt.
JasonSmith
1
@ctn Das liegt einfach daran, dass ich die Option -f( --force) vergessen habe . Ich habe die Antwort entsprechend bearbeitet. Wenn Sie dann antworten, verwendet Ihre Referenz dieselbe Option.
VonC
42

Aktualisieren: Dies funktioniert nur für die lokale Kopie des Repositorys (den "Client"). Bitte beachten Sie die Kommentare anderer unten.

Mit einer aktuellen Version von git (Februar 2014) wäre das richtige Verfahren:

git remote set-head $REMOTE_NAME $BRANCH

Zum Beispiel wäre das Umschalten des Kopfes auf Remote originzu Branch develop:

git remote set-head origin develop

jrhorn424
quelle
Benötigt diese Funktion eine aktuelle Version von Git auf dem Server oder reicht es aus, wenn auf dem Clientcomputer die neueste Version von Git installiert ist?
Mikko Rantalainen
3
@ Motor ist knapp aber richtig; Diese Antwort sollte abgelehnt werden. Git hat dieses etwas verwirrende Konzept eines "lokalen Standardzweigs für die Fernbedienung". Sie können "origin" anstelle von "origin / defaultbranch" eingeben und sind eine reine clientseitige Sache. Lange Geschichte bei git-scm.com/docs/git-remote # set-head
MarcH
1
um zu bestätigen, wovon @MarchH spricht: run git checkout -b default; git push origin HEAD; git remote set-head origin default. Sie können dann die lokalen Änderungen mit cat .git/refs/remotes/origin/HEAD(sollte es sein ref: refs/remotes/origin/default) und das Fehlen von Remote-Änderungen mit überprüfen git remote show origin(es wird immer noch das sein, was es war, bevor Sie den Standardzweig hinzugefügt haben).
De Novo
37

Da Sie GitHub erwähnen, gehen Sie einfach in Ihr Projekt, um es auf ihrer Website zu tun, dann ...

admin > Default Branch > (choose something)

Getan.

srcspider
quelle
1
Ausgezeichnet! Das war das letzte fehlende Stück.
Berkus
Mein Ursprung / KOPF zeigt bereits auf einen Feature-Zweig anstelle von Master. Ich habe versucht, "Hauptzweig" hin und her zu wechseln, aber es hatte keinen Einfluss auf den KOPF ... Irgendwelche Vorschläge?
Daniil Shevelev
3
Einstellungen> Zweige> Standardzweig
Chun Yang
12

Sehen: http://www.kernel.org/pub/software/scm/git/docs/git-symbolic-ref.html

Dadurch wird der Standardzweig im Git-Repository festgelegt. Sie können dies in nackten oder gespiegelten Repositorys ausführen.

Verwendung:

$ git symbolic-ref HEAD refs/heads/<branch name>
mani-frisch
quelle
6
$ git symbolisch-ref KOPF refs / Köpfe / Name des Zweigs
Lamy
Ich habe dies in meinem Remote-Repo getan und es hat meine Probleme beim Klonen behoben, bei denen der Kopf aus irgendeinem Grund ein anderer Zweigname war und daher der Versuch, den Master zu klonen, zu einem Fehler beim Versuch führte, den Master in Composer zu schließen. Dies könnte für dieses Szenario sehr spezifisch sein , aber andere könnten in dieser Position sein und sich fragen, was zu tun ist
Christopher Thomas
10

(Es gab schon grundsätzlich die gleiche Frage " Erstellen Sie einen symbolischen Git-Ref im Remote-Repository ", die keine universelle Antwort erhielt.)

Es gibt jedoch spezifische Antworten für verschiedene Git- "Farmen" (in denen mehrere Benutzer Git-Repos über eine eingeschränkte Schnittstelle verwalten können: über http und ssh): http://Github.com , http://Gitorious.org , http: / /repo.or.cz , Girar ( http://git.altlinux.org ).

Diese spezifischen Antworten können für diejenigen nützlich sein, die diese Seite lesen und über diese spezifischen Dienste nachdenken.

imz - Ivan Zakharyaschev
quelle
4
Jetzt haben sie ein Dropdown-Menü zur Auswahl des HEAD-Zweigs unter repo.or.cz (Beispiel: repo.or.cz/editproj.cgi?name=for-me-and-for-all_imz.git ) und gitorious.org , auch. Toll!
imz - Ivan Zakharyaschev
7

Wenn Sie von einer Shell aus auf das Remote-Repo zugreifen können, gehen Sie einfach in die .git-Datei (oder in das Hauptverzeichnis, wenn es sich um ein nacktes Repo handelt) und ändern Sie die HEAD-Datei so, dass sie auf den richtigen Kopf zeigt. Beispielsweise enthält es standardmäßig immer 'refs: refs / Heads / Master'. Wenn Sie jedoch stattdessen foo als HEAD benötigen, bearbeiten Sie einfach die HEAD-Datei und ändern Sie den Inhalt in 'refs: refs / Heads / foo'.

Abzieher
quelle
Ich habe Administratorrechte auf dem Git-Server und habe genau das Gleiche getan. Wir verwenden Gitolite und ich ging zu dem Repository, das ich erstellt habe. Der Verzeichnisname lautet myrepo.git. Der Inhalt der HEAD-Datei im angegebenen Verzeichnis wurde von ref: refs/heads/masternach geändert ref: refs/heads/mainline. Wenn ich jetzt versuche, das Repository auf meiner lokalen Box zu klonen, zeigt es immer noch auf Master. Ich habe das git clone ssh://[email protected]/myrepoKommando ausgeführt. Irgendeine Idee für ein solches Verhalten?
Technext
Git-Server-Version: git version 1.7.1& Git-Client-Version:git version 1.9.4.msysgit.2
Technext
5

Sie können einen freistehenden erstellen Master Zweig nur Porzellan Git Befehl:

git init
touch GO_AWAY
git add GO_AWAY
git commit -m "GO AWAY - this branch is detached from reality"

Die uns einen gibt Master - Zweig mit einem unfreundlichen Nachricht (Sie höflicher sein wollen). Jetzt erstellen wir unseren "echten" Zweig (nennen wir ihn zu Ehren von SVN Trunk ) und scheiden ihn vom Master :

git checkout -b trunk
git rm GO_AWAY
git commit --amend --allow-empty -m "initial commit on detached trunk"

Hey, Presto! gitk --all zeigt Master und Trunk ohne Verbindung zwischen ihnen.

Die "Magie" hier ist, dass --amend bewirkt , dass git commit ein neues Commit mit demselben übergeordneten Element wie der aktuelle HEAD erstellt und HEAD dann darauf zeigt. Der aktuelle HEAD hat jedoch kein übergeordnetes Element, da es sich um das anfängliche Commit im Repository handelt. Daher erhält der neue HEAD auch kein Commit, sodass sie voneinander getrennt werden.

Das alte HEAD-Commit wird von git-gc nicht gelöscht, da Refs / Heads / Master immer noch darauf verweisen .

Das Flag --allow-empty wird nur benötigt, weil wir einen leeren Baum festschreiben . Wenn es nach dem Git rm einige Git- Adds gäbe, wäre dies nicht notwendig.

In Wahrheit können Sie jederzeit einen getrennten Zweig erstellen, indem Sie das anfängliche Commit im Repository verzweigen, seinen Baum löschen, Ihren getrennten Baum hinzufügen und dann git commit --amend ausführen .

Ich weiß, dass dies nicht die Frage beantwortet, wie der Standardzweig im Remote-Repository geändert werden kann, aber es gibt eine saubere Antwort darauf, wie ein getrennter Zweig erstellt wird.

kbro
quelle
1
Sie können einen getrennten Zweig einfacher erstellen, indem Sie einen nicht verwandten Zweig aus einem anderen Repo abrufen und ihm einen Namen geben. Fügen Sie beispielsweise git fetch git:[email protected]:foo remote-branch-name && git checkout -b detached-branch FETCH_HEADeinen neuen Zweig hinzu detached-branch, der dem Zweig remote-branch-namein Remote entspricht git:[email protected]:foo. Natürlich kann die "Remote" ein Repository in einem lokalen Dateisystem sein, das Sie zuvor vorbereitet haben.
Mikko Rantalainen
2

Erstellen Sie zunächst den neuen Zweig, den Sie als Standard festlegen möchten, zum Beispiel:

$>git branch main

Als nächstes schieben Sie diesen Zweig zum Ursprung :

$>git push origin main

Wenn Sie sich jetzt bei Ihrem GitHub-Konto anmelden, können Sie in Ihr Repository gehen und Einstellungen> Standardzweig wählen und " Haupt " wählen .

Wenn Sie dies wünschen, können Sie den Hauptzweig löschen:

$>git push origin :master

4mnes7y
quelle
Der wichtigste Punkt, den Sie verstehen sollten, ist, dass Sie kein Glück haben, wenn Sie als Hosting-Anbieter (in diesem Beispiel GitHub) keine Methode zum Ändern des Standardzweigs bereitstellen. Das Git-Protokoll bietet keine Funktion zum Ändern des Remote-Standardzweigs. Sie müssen in der Lage sein, git symbolic-refauf der Remote-Shell ausgeführt zu werden oder auf andere Weise die HEADim Remote-Repository-Stammverzeichnis aufgerufene Textdatei zu ändern .
Mikko Rantalainen
2

Im Zusammenhang mit der Frage bin ich hier gelandet, als ich gesucht habe nach:

Wie mache ich ein lokales Repo auf einen geänderten Standardzweig auf GitHub aufmerksam?

Der Vollständigkeit halber fügen Sie die Antwort hinzu:

git remote set-head origin -a
friederbluemle
quelle
0

Für Gitolite-Leute unterstützt Gitolite einen Befehl namens - warte darauf - symbolic-ref. Sie können diesen Befehl remote ausführen, wenn Sie über die W-Berechtigung (Schreibberechtigung) für das Repo verfügen.

Sitaram
quelle
-1

Einfach melden Sie sich einfach in Ihrem Konto GitHub und auf der rechten Seite im Navigationsmenü wählen Einstellungen , in der Registerkarte Einstellungen wählen Standardzweig und zurück zur Hauptseite des Repository zurück, die den Trick für mich getan hat.

Matija
quelle
1
Während der neue Zweig als Standard in der GitHub-Oberfläche angezeigt wird, erhalte ich diesen Zweig nicht, wenn ich einen Git-Klon [Repo] mache. dh .git / HEAD enthält die falsche Referenz.
Joseph Sheedy