wake-up-neo.com

Ändern Sie eine Git-Fernbedienung HEAD, um auf etwas anderes als master zu verweisen

Wie setze ich den HEAD Verweis einer Git-Fernbedienung auf etwas anderes als "master"?

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: // zugänglich, ohne Shell-Zugriff (wie GitHub oder Unfuddle).

Mein Problem ist, dass das entfernte Repository immer noch einen HEAD Verweis auf refs/heads/master enthält, aber ich brauche ihn, um auf einen anderen Zweig zu verweisen. Dies verursacht zwei Probleme:

  1. Wenn Sie das Repo klonen,

    warnung: remote HEAD bezieht sich auf eine nicht vorhandene Referenz, die nicht ausgecheckt werden kann.

    Das ist verwirrend und unbequem.

  2. Der webbasierte Code-Browser hängt von HEAD als Grundlage für das Durchsuchen des Baums ab. Ich brauche HEAD, um dann auf einen gültigen Zweig zu verweisen.

117
JasonSmith

Es gab fast die gleiche Frage bei GitHub vor einem Jahr.

Die Idee war, den Hauptzweig umzubenennen:

git branch -m master development
git branch -m published master
git Push -f Origin master 

Machen Sie, dass der Meister das hat, was Sie wollen, und erledigen Sie alle anderen Arbeiten in Zweigen.

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

Dies ist ähnlich wie " Wie lösche ich Origin/Master in Git ".


Wie gesagt in dieser Thread : (Hervorhebung meines)

"git clone" Erstellt nur eine einzige lokale Verzweigung.
Zu diesem Zweck wird der HEAD ref Des Remote-Repos angezeigt und eine lokale Verzweigung mit demselben Namen wie die von ihr referenzierte Remote-Verzweigung erstellt.

Zum Abschluss haben Sie also Repo A und klonen es:

  • HEAD verweist auf refs/heads/master und das existiert
    -> Sie erhalten eine lokale Verzweigung mit dem Namen master, beginnend mit Origin/master

  • HEAD referenziert refs/heads/anotherBranch Und das existiert
    -> Sie erhalten eine lokale Filiale mit dem Namen anotherBranch, beginnend mit Origin/anotherBranch

  • HEAD referenziert refs/heads/master Und das existiert nicht
    -> "git clone" beschwert sich

Ich bin mir nicht sicher, ob es eine Möglichkeit gibt, die HEAD -Ref in einem Repo direkt zu ändern .

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


Vielleicht der einzige Weg wäre ein "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 unter " Git: Richtige Methode zum Ändern von Active Branch in einem leeren Repository? " erläutere, würde git remote set-head am Remote-Repository nichts ändern.

Dies würde nur den Zweig für die Fernverfolgung ändern, der lokal in Ihrem lokalen Repository in remotes/<name>/HEAD Gespeichert ist.

61
VonC

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

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

git remote set-head $REMOTE_NAME $BRANCH

Das Umschalten des Heads auf remote Origin auf branch develop wäre beispielsweise:

git remote set-head Origin develop

40
jrhorn424

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.

34
srcspider

Siehe: 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 leeren oder gespiegelten Repositorys ausführen.

Verwendung:

$ git symbolic-ref HEAD refs/heads/<branch name>
11
mani-fresh

(Es gab bereits im Grunde die gleiche Frage " Erzeuge einen Git-symbolischen Verweis 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 Oberfläche 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 hilfreich sein, wenn Sie diese Seite lesen und über diese spezifischen Dienste nachdenken.

Wenn Sie von einer Shell aus Zugriff auf das Remote-Repo haben, wechseln Sie einfach in das Verzeichnis .git (oder in das Hauptverzeichnis, falls es sich um ein reines Repo handelt) und ändern Sie die Datei HEAD), um auf den richtigen Kopf zu verweisen. Beispielsweise enthält es standardmäßig immer 'refs: refs/heads/master', aber wenn Sie foo als HEAD benötigen, bearbeiten Sie stattdessen einfach HEAD = Datei und ändere den Inhalt in 'refs: refs/heads/foo'.

7
squeegee

Sie können einen abgetrennten Master Zweig nur mit Git-Befehlen aus Porzellan erstellen:

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

Das gibt uns eine master Verzweigung mit einer unhöflichen Nachricht (Sie möchten vielleicht höflicher sein). Jetzt erstellen wir unseren "echten" Zweig (nennen wir ihn trunk zu Ehren von SVN) und scheiden ihn von master aus:

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

Hallo Presto! gitk --all zeigt master und trunk ohne Verbindung zwischen ihnen.

Die "Magie" hier ist, dass - modifygit commit ein neues Commit mit demselben übergeordneten Element wie das aktuelle HEAD erstellt und dann HEAD darauf verweisen. Aber das aktuelle HEAD hat kein übergeordnetes Element, da es das anfängliche Festschreiben im Repository ist, sodass das neue HEAD nicht Sie erhalten auch keine, wodurch sie voneinander getrennt werden.

Das alte Commit HEAD wird nicht von git-gc gelöscht, da refs/heads/master immer noch darauf verweist.

Das - allow-empty Flag wird nur benötigt, weil wir einen leeren Baum übergeben. Wenn es einige git add nach dem git rm gäbe, wäre es nicht notwendig.

In Wahrheit können Sie jederzeit einen getrennten Zweig erstellen, indem Sie das ursprü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 wird, aber es gibt eine klare Antwort, wie ein losgelöster Zweig erstellt wird.

5
kbro

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

$>git branch main

Als nächstes schieben Sie diesen Zweig auf die Ursprung:

$>git Push Origin main

Wenn Sie sich jetzt in Ihrem GitHub-Konto anmelden, können Sie in Ihrem Repository "Einstellungen"> "Standardzweig" auswählen und "main. "

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

$>git Push Origin :master

2
4mnes7y

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 Berechtigung W (Schreiben) für das Repository verfügen.

0
sitaram