2017-09-25 1 views
0

Ich brauche einen "Roboter-Benutzer", der mit einem Git-Remote-Repository durch einige Skripte interagiert. Dieser bare Repo wird als zentraler Repo bezeichnet.Spiegelung eines Git-Nicht-Nackt-Repository

Dieses Mal hat dieser Roboterbenutzer sein eigenes lokales Repository, das kein leeres Repository ist (er muss Filialen abchecken, Zweige zusammenführen, ...). Aber jede Nacht, wenn er zur Arbeit erwacht, muss er lokal einen perfekten Spiegel des zentralen Repos haben (jeder Ast außer Meister könnte sich entwickelt haben, einige neue Zweige könnten erschaffen worden sein, ...).

Was ist der beste Weg, das zu tun?

Antwort

1

Leider ist dies nicht so einfach wie die vorherige Antwort schlägt vor, weil git pull nur Änderungen in den aktuellen Zweig integriert.

Das erste, was Ihr Bot tun muss, ist git fetch - und während es wahr ist, dass ein git pull würde (Standardeinstellung) führen dies geschehen kann, empfehle ich die fetch direkt potentiell verwirrenden Nebenwirkungen zu vermeiden tun.

Wenn Sie eine fetch tun, hängt das, was Sie erhalten, von der remote.central.fetch Konfigurationsoption ab (für eine Fernbedienung namens central, wie Sie angegeben haben). Die Standardeinstellung nach einem clone (vorausgesetzt, Sie nicht so etwas wie mirror, single-branch oder depth ohne no-single-branch zum clone Befehl ... angegeben haben), um die Geschichten aller Branchen holen würde, und Remote-Zweig Refs aktualisieren würde (zB refs/origin/central/master, um anzuzeigen, der Zustand der master Niederlassung auf central).

Wenn Sie dabei bleiben, sind Ihre lokalen Refs immer noch nicht mit der Fernbedienung synchronisiert. Ob das ein Problem ist, hängt davon ab, was dein Bot macht. Es gibt viele Permutationen hier ... Könnte dein Bot lokale Änderungen vor der fetch haben, und wenn ja, was würdest du damit machen wollen? Wird Ihr Bot Änderungen nach der fetch vornehmen, und wird er schließlich diese Änderungen vornehmen? Plus eine beliebige Anzahl von "wenn Sie wollen, dass die Geschichte wie X aussieht, machen Sie Y" Überlegungen.

Ich werde sagen, dass, wenn Ihre Absicht ist es, alle lokalen Niederlassungen zu bewegen, um den entsprechenden Zweig zu reflektieren central gibt zwei grundlegende Ansätze sind:

1) die Refspec in der Default-Einstellung verlassen, dann über Niederlassungen iterieren Aktualisiere den lokalen Verweis, um ihn mit der Fernbedienung abzugleichen. Dies gibt Ihnen die Möglichkeit, mit lokalen Änderungen fertig zu werden (indem Sie sie entweder in die Zweighistorie zusammenführen oder neu auffächern), aber es erfordert eine Menge Scripting.

2) Ändern Sie die Refspec so, als ob sie auf einem Spiegelklon aussehen würde. (Ich habe den Eindruck, dass Sie damit konfrontiert sind, wie Sie die Frage formuliert haben.) Dies ist vielleicht riskant, weil lokale Änderungen einfach durcheinander gebracht werden könnten, und Sie müssten dennoch alle Zweige identifizieren, die auf central gelöscht wurden.Das Setup wäre hier so etwas wie

git config remote.central.fetch +refs/*:refs/* 
0

Es ist ziemlich einfach (wenn durch perfekte Spiegel Sie all branches, but not other refs bedeuten).

Das Klonen des leeren Repos ohne --bare führt zu einem normalen Repo. Nachdem Sie dies einmal getan haben, muss Ihr Roboter einfach

git pull 

, wenn er zur Arbeit kommt.

Verwandte Themen