Git: Richtiger Weg, um Active Branch in einem nackten Repository zu ändern?


195

Ich habe ein nacktes Repository, das als zentraler Speicher für mein Projekt verwendet wird. Alle Entwickler tun git clone <repo>, um mit ihm zu teilen. Wenn sie den Klon ausführen, erhalten sie eine Überprüfung des Hauptzweigs (sofern dies nicht der Fall ist git clone -n), da dieser repo.git/HEADenthält ref: refs/heads/master, wodurch dieser zum aktiven Zweig wird .

Die Frage ist, wie ich den aktiven Zweig richtig ändere . Ich könnte die repo.git/HEADDatei einfach direkt hacken , aber das scheint böse und, na ja, hackig.

Ich habe es git checkout <otherbranch>im Repo- .gitVerzeichnis versucht , aber das ist fehlgeschlagen, weil ich nicht in einem Arbeitsbaum war.

Ich habe versucht, git update-ref HEAD refs/heads/otherbranchaber das hat gerade refs / Heads / Master so aktualisiert, dass es mit Refs / Heads / Otherbranch identisch ist (okay, ich habe das in einem Dummy-Repository gemacht, nicht in meinem Produktions-Repository!)

Ich habe es versucht git update-ref --no-deref HEAD refs/heads/otherbranchund das hat fast funktioniert. Die HEADDatei wurde aktualisiert , aber auf SHA1 des Commits gesetzt, auf das von verwiesen wird refs/heads/otherbranch.

Ich teste mit der Git-Version 1.7.0.2.msysgit.0.

Ich vermute, es gibt keine Möglichkeit, dies zu tun git push, da es ein bisschen unsicher (!) Scheint, allen und jedem zu erlauben, Ihren Standardzweig zu ändern, aber es gibt sicherlich einen besseren Weg, dies im Repo- .gitVerzeichnis zu tun, als die HEADDatei direkt zu hacken .


IMO, Sie versuchen hier im Grunde nur, das Falsche zu tun. Wenn Sie möchten, dass der Standardzweig etwas anderes als Master ist, muss dieser Zweig der Master sein. Verwenden Sie alternativ zwei verschiedene Repositorys.
Nicholas Knight

12
Wie versucht das grundsätzlich, hier das Falsche zu tun? Ein nacktes Repository unterstützt mehrere Zweige. Ich verwende ein nacktes Repository als Backup für mein lokales Repository und spiegele als solches die Zweige. Ich habe einen Master in beiden und einen Entwicklungszweig in beiden. Wenn ich das Protokoll des Entwicklungszweigs im Bare-Repository sehen möchte, muss ich Dateien hacken - anscheinend ist Git hier in Bezug auf die Unterstützung des Bare-Repositorys grundlegend falsch.
Cthutu

15
@NicholasKnight IMHO bist du hier grundsätzlich falsch. "Master" als Filialname hat nichts Besonderes, es ist nur eine Standardeinstellung. In den verwalteten Respositories haben wir keine Hauptniederlassung, da "Master" für das Unternehmen nicht von Bedeutung ist. Bei jeder Freigabe erstellen wir einen neuen Wartungszweig mit der neuen Versionsnummer und weisen diesen als aktiven Zweig zu.
Spacemoose

@NicholasKnight Obwohl ich zu schätzen weiß, woher du kommst, ist dies das erste SO Q / A, das mir sagt, wie ich zum Master wechseln soll ! Ich hatte mein erstes Repo in einem Feature-Zweig, als ich meinen Bare-Klon erstellt habe, und nachfolgende Klone aus diesem Bare-Repo verwendeten standardmäßig diesen Zweig anstelle von Master.
Warbo

1
Wow - diese Frage läuft und läuft - es ist meine Nummer 1 unter den Reputationspunkten! Die Sache mit "Master" ist, dass es nur ein Name ist. Wenn es für Ihre Organisation, Ihr Team, Ihr Projekt, Ihre Phase usw. keinen Sinn ergibt, wählen Sie etwas, das angemessen ist, damit die Mitarbeiter, die Ihr Repo klonen, sofort wechseln zu dem Zweig, in dem sie als Configuration Manager sein sollen. Ich habe früher mit ClearCase gearbeitet (Bletch!), Also waren Ihre Entscheidungen "main", "main" oder "main". Yuk.
Kbro

Antworten:


279

Wenn Sie Zugriff auf das Remote Bare Repo haben, schlägt dieser Artikel vor :

git symbolic-ref HEAD refs/heads/mybranch

Dadurch wird die HEAD-Datei in Ihrem Repository so aktualisiert, dass sie Folgendes enthält:

ref: refs/heads/mybranch

wie in der dokumentiert git-symbolic-ref


Wenn Sie keinen Zugriff auf das Remote-Repo haben, lesen Sie meine vorherige Antwort .


Denken Sie daran, dass ein Befehl wie git remote set-head:

  • ändert den Standardzweig des Remote- Repos nicht.
    Es wird nur ein Remote-Tracking-Zweig geändert , der in Ihrem lokalen Repo als gespeichert istrefs/remotes/<name>/HEAD

  • ändert sich nicht HEAD(wieder nur refs/remotes/<name>/HEAD), daher die Notwendigkeit für git symbolic-ref.

Also git remote set-head ist hier nicht die Antwort.
git symbolic-ref HEADist, wenn Sie direkten Zugriff auf das Remote-Repo haben.


3
Vielen Dank! Ich habe direkten Zugriff auf das Remote-Bare-Repo, damit git-symbolic-ref die Arbeit erledigt. Ich mag den No-Common-Ahnen-Trick, der im anderen Thread erwähnt wird - definitiv einen für die unterste Schublade. Ich habe ewig damit gegoogelt, konnte aber Ihre vorherige Antwort nicht finden, aber "git remote head master" findet sie als zweithöchsten Treffer direkt unter git-remote (1). Bizarr. Nur um zu zeigen, wie schwierig es ist, etwas zu finden, wenn Sie nicht genau wissen, wonach Sie suchen.
Kbro

git symbolic-ref HEAD refs/heads/mybranchhat gut funktioniert für mich! VIELEN DANK! ;)
vinzenzweber

1
Ich schätze diese Frage sehr, weil ich versehentlich einen anderen Zweig als Master ausgecheckt habe und das jetzt beheben musste.
Jonny Best

Das funktioniert bei mir nicht. Seltsamerweise zeigt mir git STILL standardmäßig einen anderen Zweig an, obwohl der Remote-HEAD im Bare Repo jetzt den richtigen Zweig anzeigt, wenn ich von ihm klone!
Magnus

@Magnus das wäre eine gute Frage für sich auf einer neuen Seite.
VonC

3

Um den Zweig zu ändern, müssen Sie den HEAD-Verweis auf den Zweig ändern, den Sie verwenden möchten.

Listen Sie zunächst alle Referenzen im Bare-Repository auf

$find ref

Suchen Sie dann die Referenz für Ihre Branche. Das Format lautet wie folgt refs/heads/<my_branch>. Der nächste Schritt besteht darin, die aktuelle Referenz zu überprüfen. Geben Sie einfach Folgendes ein:

$git symbolic-ref HEAD

Sie wissen also, welcher Zweig aktuell ist, und aktualisieren ihn dann nach Bedarf.

$git sumbolic-ref HEAD ref/heads/<my_branch>

Das ist es. Genießen.


2

Wie ändere ich den aktiven Zweig richtig?

  • status: git checkout im repo .git-verzeichnis gibt fatal zurück: Dieser Vorgang muss in einem Arbeitsbaum ausgeführt werden

  • Tipps: Fügen Sie einfach das Argument --work-tree hinzu

Ausführliches Beispiel: Annahmen: Bare Git auf Remote-Server:

~ / bare_git_repository.git losgelöster Arbeitsbaum: / var / www / myappremote

auf lokalem Server: Zweigversion erstellen.1.7 (unser anderer Zweig)

Git Branch Version.1.7

Git Push Origin Version.1.7

auf dem Remote-Server mit Git Bare Repo:

$ cd ~ / bare_git_repository.git

$ git branch

  • Master-
    Version.1.7

Wie angegeben, folgender Befehl

Git Checkout Version.1.7

Rückkehr

fatal: Dieser Vorgang muss in einem Arbeitsbaum ausgeführt werden

Verwenden Sie den folgenden Befehl

git --work-tree = / var / www / myappremote checkout version.1.7

Ändern Sie den aktiven Zweig erfolgreich

$ git branch

Meister

  • version.1.7

Überprüfen Sie die Ergebnisse wie folgt

ll / var / www / myappremote

hoffe es wird helfen


Diese sehr einfache Lösung hat bei mir funktioniert, danke! Ein Hinweis: Ich musste von Hand ein leeres Arbeitsbaumverzeichnis erstellen, damit der Befehl erfolgreich ausgeführt werden konnte.
Joël Esponde

-1

Wenn Sie keinen Zugriff auf das nackte Repository haben, führen git remote set-headSie a aus, und Sie sind fertig

Siehe diese vorherige Antwort


-3

Ich habe auch ein nacktes Repo auf unserem Server und konnte erfolgreich Dateien mit abrufen

git clone //server/repo/directory -b branch_name

in ein neues lokales Repository, obwohl die Manpage angibt, dass dies nur für nicht nackte Repositorys gilt.


1
Während das, was Sie sagen, wahr ist, bricht die Tatsache, dass Sie -b verwenden, um einen bestimmten Zweig auszuwählen, Ihre Antwort im Kontext meiner Frage. Wie setzen Sie den DEFAULT-Zweig?
kbro

-4

Ich habe zwei Verzeichnisse vor und nach der Bewerbung verglichen

git symbolic-ref HEAD refs/heads/mybranch

und es scheint, dass nur die Datei repo.git / HEAD geändert wurde, so dass es wahrscheinlich ziemlich sicher ist, die Datei nur zu "hacken".


2
Es gibt subtile Probleme beim Brechen, die durch direktes Bearbeiten von Git-Ref-Dateien verursacht werden können. Ich kann es nur wärmstens empfehlen. Die Installationsbefehle sind einfacher und sicherer als das direkte Bearbeiten von Refs.
Alain O'Dea

2
Was ist der Vorteil dieses @boryn?
Alex Chamberlain

2
Git verfolgt viele Dinge im Hintergrund wie eine Geschichte von Schiedsrichtern. Wenn Sie die Datei manuell ändern, wird sie nicht protokolliert. Es ist wahr, dass es wahrscheinlich keine Rolle spielt. Wenn Sie jedoch einige Commits aus den Augen verlieren und sie finden möchten, sind Sie glücklicher, wenn Sie die Datei nicht einfach "hacken".
QWERTY9967

Ich habe den Befehl benutzt. Aber diese Antwort war hilfreich, um zu verstehen, wie es funktioniert, und insbesondere um zu verstehen, dass Refs / Heads etwas Internes sind und ich es nicht ändern sollte, nur den letzten Teil des "Pfades". Also habe ich abgestimmt, weil ich denke, dass es doch wertvolle Informationen waren.
Mike Keskinov
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.