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:
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.
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 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.
>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.) 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:
Ich hoffe, das ist von Nutzen.
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.