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:
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.
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.
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 derHEAD 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 aufrefs/heads/master
und das existiert
-> Sie erhalten eine lokale Verzweigung mit dem Namen master, beginnend mit Origin/masterHEAD referenziert
refs/heads/anotherBranch
Und das existiert
-> Sie erhalten eine lokale Filiale mit dem NamenanotherBranch
, beginnend mitOrigin/anotherBranch
HEAD referenziert
refs/heads/master
Und das existiert nicht
-> "git clone" beschwert sichIch 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.
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
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.
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>
(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.
$ ssh git.alt help | fgrep branch default-branch <path to git repository> [<branch>] $
beispielsweise ssh git.alt default-branch packages/autosshd.git sisyphus
, um HEAD in der Fernbedienung zu ändern autosshd.git
, um auf den Zweig sisyphus
zu verweisen.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'.
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.
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
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.