Wie aktualisiere ich mein Bare Repo?

133

Ich habe ein Bare-Repo erstellt, um mein Repository zu veröffentlichen, kann jedoch nicht herausfinden, wie das Bare-Repo mit dem aktuellen Status des Haupt-Repositorys aktualisiert werden kann.

Šimon Tóth
quelle
2
Siehe diese Antwort: stackoverflow.com/questions/315911/…
Ken Bloom

Antworten:

83

Wenn Sie alle Objekte aus dem Haupt-Repo duplizieren möchten, tun Sie dies im Haupt-Repo:

git push --all <url-of-bare-repo>

Alternativ können Sie auch im nackten Repo abrufen:

git fetch <url-of-main-repo>

Sie können keinen Pull machen, weil ein Pull mit ihm verschmelzen möchte HEAD, was ein nacktes Repo nicht hat.

Sie können diese als Fernbedienungen hinzufügen, um sich in Zukunft das Tippen zu ersparen:

git remote add <whatever-name> <url-of-other-repo>

Dann können Sie einfach tun

git push --all <whatever-name>

oder

git fetch <whatever-name>

je nachdem , was Repo sind Sie in. Wenn <whatever-name>ist origin, können Sie es sogar ganz weglassen.

Haftungsausschluss: Ich bin kein Git-Guru. Wenn ich etwas Falsches sagte, würde ich gerne erleuchtet werden!

Update: Lesen Sie die Kommentare!

Thomas
quelle
7
Als ich ein git-fetch --allinnerhalb des nackten Repositorys erstellt habe, habe ich keine Aktualisierungen gesehen, die ich am Haupt-Repo vorgenommen habe, aber wenn git push --all <url-of-bare-repo>ich sie aus dem Haupt-Repo mit verschoben habe, werden die Aktualisierungen in angezeigt git log. Vermutlich gibt es dafür eine einfache Erklärung - kann jemand das erklären?
Pho79
2
@Thomas - Ja, mit "nicht gesehen" meine ich, git logdass diese Updates nicht im Bare Repo angezeigt werden. (Weder noch git log --allein funktionierendes Repo, das durch Klonen des Bare-Repo erstellt wurde - entweder über git log --alloder durch einfaches Betrachten neuer Dateien, die dort angezeigt werden sollen). Es ist ein ziemlich schneller Test, um sich selbst davon zu überzeugen. Meistens bin ich nur neugierig, was mir fehlt.
Pho79
70
Wenn Ihr entferntestes Repo so etwas wie Github ist, auf das Sie keinen Zugriff haben, keinen Push ausführen können usw., können Sie dies git fetch -q origin master:masterin Ihrem lokalen Bare-Repo tun . Dadurch werden die neuen Inhalte aus dem Hauptzweig von github abgerufen und Ihr lokaler Hauptzweig darauf aktualisiert.
Altreus
4
@Altreus In der Tat master:masterist es erforderlich, HEAD vorwärts zu dem des Remote- Repos zu bewegen. In meinem Fall konnte ich aufgrund eines Problems keine Verbindung mehr zu unserem Bare Repo herstellen, da Git fehlte. Bis es gelöst ist, mache ich einen umgekehrten Tunnel und hole mit: zum zentralen Repo git fetch ssh://localhost:8765/... master:masterund es funktioniert wie ein Zauber. Vielen Dank!
Estani
2
@Altreus Wenn Sie alle Zweige wollen, dann können Sie tungit fetch origin *:*
JBert
71

Ich habe ein Repository mit dem folgenden Befehl erstellt

git clone --bare <remote_repo>

Dann habe ich versucht, den nackten Klon mit der Antwort von Thomas zu aktualisieren, aber es hat bei mir nicht funktioniert. Um das nackte Repository zu aktualisieren (was Let_Me_Be meiner Meinung nach gefragt hat), musste ich ein Spiegel-Repository erstellen:

git clone --mirror <remote_repo>

Dann könnte ich den folgenden Befehl im gespiegelten Repository ausführen, um die Aktualisierungen des Hauptrepositorys abzurufen:

git fetch --all

Ich bin auf diese Lösung gestoßen, indem ich Mirror a Git Repository By Pulling gelesen habe

austen
quelle
22
Um ein vorhandenes Bare-Repo in Spiegelung zu ändern, müssen Sie der Git-Konfigurationsdatei unter <REPO> .git / config lediglich zwei Zeilen hinzufügen. In dem [remote "origin"]Abschnitt hinzufügen fetch = +refs/*:refs/*undmirror = true
Isaac Betesh
@IsaacBetesh Du hast meinen Tag gerettet :)
smc
54

Die einzige Lösung neben der Neuerstellung mit git clone --mirrorist von Gregor :

git config remote.origin.fetch 'refs/heads/*:refs/heads/*'

Dann können Sie git fetchund Sie werden die Updates sehen. Das Seltsame ist, dass vorher, obwohl es eine remotekonfigurierte gibt, keine Zweige darin aufgelistet sind git branch -a.

Colin D Bennett
quelle
1
Das hat mir wirklich geholfen! Capistrano project / repo verwendet diese Einstellung auch, damit Einzeiler git remote updatedie Arbeit erledigen können.
Minqi Pan
1
Wenn der Remote - Kraft aktualisiert oder gelöscht Zweige (und Sie möchten diese Änderungen widerspiegeln), müssen Sie hinzufügen --forceund --prunejeweils an die git fetchLinie.
Elliott Slaughter
46

Angenommen:

$ git clone --bare https://github.com/.../foo.git

Holen Sie mit:

$ git --git-dir=foo.git fetch origin +refs/heads/*:refs/heads/* --prune

Hinweis: --git-dir=foo.gitist nicht erforderlich, wenn Sie zuerst cdin das Verzeichnis wechseln.

Antak
quelle
2
Obwohl mir nicht bekannt ist, wann dies auftritt, originkönnen Sie das originTeil jederzeit durch den Pfad / die URL zu Ihrem ursprünglichen Repository ersetzen , wenn dies nicht definiert ist . zB$ git --git-dir=foo.git fetch https://github.com/.../foo.git +refs/heads/*:refs/heads/*
Antak
Genau das habe ich gesucht. Das hat perfekt funktioniert.
Maxime Rouiller
13

Nach langem Herumspielen habe ich festgestellt, dass dies für mich funktioniert.

Einmal:

git clone --mirror ssh://[email protected]:2000/repo
git remote add remote_site ssh://git@remote_site.address/repo
git config remote.origin.fetch 'refs/heads/*:refs/heads/*'

Jedes Mal, wenn ich synchronisieren möchte:

cd /home/myhome/repo.git
git --bare fetch ssh://[email protected]:2000/repo
git  fetch ssh://[email protected]:2000/repo
git push --mirror remote_site
simonvc
quelle
7
Die dritte Zeile ( git config remote.origin.fetch 'refs/heads/*:refs/heads/*') ist der Schlüssel. Gute Antwort, danke!
Peter - Wiedereinstellung Monica
2
Wie @peterh sagte, ist die Zeile git config remote.origin.fetch 'refs/heads/*:refs/heads/*'die Antwort. Nachdem ich diesen Befehl gedrückt habe, kann ich einfach git fetchund das Repo wird mit dem Remote synchronisiert.
Joker
3

Fügen Sie das nackte Repository als Remote-Repository hinzu und verwenden Sie es dann git push.

Philipp
quelle
Wenn ich dies also ohne Push tun möchte, kann ich kein nacktes Repository verwenden und einen symbolischen Link oder ähnliches verwenden?
Šimon Tóth
Pushing ist die normale Methode zum Übertragen von Repository-Inhalten in ein nacktes Repository. Es ist nicht erforderlich, dies zu vermeiden.
Philipp
2
Man kann nicht immer pushen. Zum Beispiel, wenn sich das Bare in einem privaten Netzwerk befindet und das Haupt-Repos ein öffentliches ist (zum Beispiel auf GitHub)
fanf42
0

Bei mir hat diese Kombination funktioniert:

git remote add remote_site https://github.com/project/repo.git
git fetch -u remote_site +refs/heads/:refs/heads/*
git push --mirror

Der Parameter -u für den Abruf war erforderlich, andernfalls wird die Fehlermeldung angezeigt: "Verweigern des Abrufs in die aktuellen Zweigstellenreferenzen / Köpfe / Master des nicht nackten Repositorys" (siehe auch https://stackoverflow.com/a/19205680/4807875 )

Alexander Samoylov
quelle