Wie bekomme ich einen Remote-Tracking-Zweig, um in einem leeren Git-Repository auf dem neuesten Stand zu bleiben?

8

Ich versuche, eine leere Kopie eines Git-Repositorys zu erhalten und einige Probleme zu haben, die Remote-Tracking-Zweige auf dem neuesten Stand zu halten. Ich erstelle die Remote-Tracking-Zweige wie folgt:

%Vor%

Dies scheint zu tun, was ich für diesen Zeitpunkt tun muss. Wenn ich jedoch Änderungen an origin vornehme und dann mit dem bloßen Repo abrufe, beginnen die Dinge auseinander zu fallen. Mein Workflow sieht folgendermaßen aus:

%Vor%

Es sieht so aus, als ob alle Commits zu diesem Zeitpunkt kommen, aber meine lokale Kopie von 0.1 wird nicht aktualisiert. Ich kann sehen, dass die Änderungen in das Repository gebracht wurden, indem Sie Folgendes tun:

%Vor%

Was muss ich tun, um meinen Tracking-Zweig mit den Updates der Fernbedienung zu aktualisieren? Ich fühle mich, als müsste ich irgendwo einen Schritt oder eine Flagge verpassen.

Aktualisiert: Zusätzliche Erläuterung

  

Normalerweise würde man in ein bloßes Repository pushen, anstatt git fetch von dort auszuführen. Wenn Sie das arrangieren können, wird das Leben viel einfacher.

Hier ein paar Erläuterungen zum Workflow.

Das öffentliche Git-Repository des Projekts wird auf GitHub gehostet. Ich verwalte das Projekt (Wiki, Ausgaben, Foren) mit Redmine. Redmine benötigt ein lokales, bloßes Repository, um zu funktionieren. Wenn GitHub Änderungen empfängt, pingt es Redmine. Redmine versucht dann, Änderungen von seinem Ursprung (GitHub) abzurufen.

Das funktioniert großartig, wenn ich nur mit Master arbeite, aber nicht mit meinen Tracking-Zweigen. Die Änderungen wurden importiert, wurden aber nicht im Redmine-Repository-Browser in der Verzweigung aufgeführt, da die lokalen Zweige nicht aktualisiert wurden.

Ich bin mir sicher, dass ich das anders hätte machen können, aber eine (generische) Lösung für das Einrichten der Tracking-Zweige zu finden, war definitiv meine Vorliebe, da die meisten git-bezogenen Plugins für Redmine Dinge wie "git fetch herkunft" annehmen "ist alles was getan werden muss.

Siehe akzeptierte Antwort für die komplette Lösung. Die --mirror Lösung scheint genau das zu sein, was in diesem Fall benötigt wird.

    
Beau Simensen 15.01.2011, 08:22
quelle

2 Antworten

17

Normalerweise würde man in ein bloßes Repository pushen, anstatt git fetch von dort auszuführen. Wenn Sie das arrangieren können, wird das Leben viel einfacher.

Wenn Sie

haben

Wenn Sie diesen Spiegel von Grund auf neu starten, Charles Bailey weist darauf hin, dass dieser Git wird all diese Einstellungen für Sie, wenn Sie das Repository zunächst mit git clone --mirror klonen.

Anderenfalls könnten Sie einen ähnlichen Effekt mit:

erzielen %Vor%

+ bedeutet, dass dadurch der Status Ihrer lokalen Zweigstellen mit denen der Gegenstelle überschrieben wird. Ohne + werden Aktualisierungen, die keine Schnellvorlauf-Zusammenführungen sind, zurückgewiesen. Wenn dies jedoch nur ein Spiegel ist, sollte das keine Rolle spielen. (Sie können dies als Standardaktion für git fetch origin konfigurieren, indem Sie die Konfigurationsvariable remote.origin.fetch auf +refs/heads/*:refs/heads/* setzen. Wenn Sie auch Tags und Remote-Tracking-Zweige vom Ursprung spiegeln möchten, können Sie stattdessen +refs/*:refs/* verwenden .)

Wenn Sie jedoch, wie Sie ursprünglich fragen, Remote-Tracking-Zweigstellen verwalten und diese selektiv in lokale Zweigstellen zusammenführen möchten, können Sie die folgenden Schritte ausführen. Ich empfehle sie jedoch nicht unbedingt, es sei denn, Sie sind die einzige Person dieses leere Repository verwenden. (Hinweis: Ursprünglich habe ich vorgeschlagen, "git symbolic-ref HEAD refs / heads / was auch immer" zu verwenden, um den Zweig zu wechseln und "git reset --soft" den Zweig ref zu ändern - jedoch Charles Bailey wies in den Kommentaren darauf hin, dass man "git update-ref refs / heads / was auch immer refs / remotes / origin / was auch immer" verwenden könnte es ist nicht erforderlich, zuerst den Zweig zu wechseln.)

Zuerst sollten Sie überprüfen, ob die Aktualisierung der Verzweigung eine Schnellvorlauf-Zusammenführung gewesen wäre, und danach die Verzweigung aktualisieren. Beachten Sie, dass es hier eine Race Condition gibt, weshalb ich sage, dass Sie dies nur tun sollten, wenn Sie die einzige Person sind, die Ihr lokales Repository verwendet - der Check wäre nutzlos, wenn sich jemand anders zwischen diesen Schritten bewegt.

>
  1. Sie können überprüfen, ob eine äquivalente Zusammenführung ein Schnellvorlauf ist (d. h. dass die Historie von origin/master master enthält), indem Sie git merge-base master origin/master mit git show-ref master vergleichen - sie sollten identisch sein. Oder Sie könnten das Skript is-ancestor in diese Frage , die diese Befehle mit einigen zusätzlichen Überprüfungen ausführt.)
  2. Abschließend können Sie Ihren aktuellen Zweig aktualisieren ( master in diesem Fall), um auf origin/master mit git update-ref refs/heads/master refs/remotes/origin/master zu zeigen.

Wie ich jedoch eingangs sagte, stelle ich mir vor, dass die wirkliche Lösung, die Sie wollen, entweder lautet:

  • Stattdessen in das leere Repository oder
  • Spiegelung des entfernten blanken Repositories genau, wie ich oben beschrieben habe

Ich hoffe, das ist von Nutzen.

    
Mark Longair 15.01.2011, 11:23
quelle
1

Wenn Sie fetch aktualisieren, aktualisieren Remote-Änderungen Ihre eigene lokale Referenz für das Remote, origin/0.1 (dies verursacht niemals irgendwelche Konflikte, da origin/0.1 niemals lokale Änderungen hostet). Um diese Änderungen zu importieren, können Sie git reset refs/remotes/origin/0.1 von 0.1 eingeben, wodurch der HEAD-Zweig ( 0.1 ) auf denselben Commit wie der entfernte Zweig verweist.

Beachten Sie, dass Sie dadurch alle Änderungen an 0.1 verlieren, die nicht von der Fernbedienung kommen.

    
huitseeker 15.01.2011 08:58
quelle

Tags und Links