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.
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:
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 :
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.
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.
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.
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.
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)
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 )
Antworten:
Wenn Sie alle Objekte aus dem Haupt-Repo duplizieren möchten, tun Sie dies im Haupt-Repo:
Alternativ können Sie auch im nackten Repo abrufen:
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:
Dann können Sie einfach tun
oder
je nachdem , was Repo sind Sie in. Wenn
<whatever-name>
istorigin
, 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!
quelle
git-fetch --all
innerhalb des nackten Repositorys erstellt habe, habe ich keine Aktualisierungen gesehen, die ich am Haupt-Repo vorgenommen habe, aber wenngit push --all <url-of-bare-repo>
ich sie aus dem Haupt-Repo mit verschoben habe, werden die Aktualisierungen in angezeigtgit log
. Vermutlich gibt es dafür eine einfache Erklärung - kann jemand das erklären?git log
dass diese Updates nicht im Bare Repo angezeigt werden. (Weder nochgit log --all
ein funktionierendes Repo, das durch Klonen des Bare-Repo erstellt wurde - entweder übergit log --all
oder 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.git fetch -q origin master:master
in Ihrem lokalen Bare-Repo tun . Dadurch werden die neuen Inhalte aus dem Hauptzweig von github abgerufen und Ihr lokaler Hauptzweig darauf aktualisiert.master:master
ist 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 Repogit fetch ssh://localhost:8765/... master:master
und es funktioniert wie ein Zauber. Vielen Dank!git fetch origin *:*
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:
Dann könnte ich den folgenden Befehl im gespiegelten Repository ausführen, um die Aktualisierungen des Hauptrepositorys abzurufen:
Ich bin auf diese Lösung gestoßen, indem ich Mirror a Git Repository By Pulling gelesen habe
quelle
[remote "origin"]
Abschnitt hinzufügenfetch = +refs/*:refs/*
undmirror = true
Die einzige Lösung neben der Neuerstellung mit
git clone --mirror
ist von Gregor :Dann können Sie
git fetch
und Sie werden die Updates sehen. Das Seltsame ist, dass vorher, obwohl es eineremote
konfigurierte gibt, keine Zweige darin aufgelistet sindgit branch -a
.quelle
git remote update
die Arbeit erledigen können.--force
und--prune
jeweils an diegit fetch
Linie.Angenommen:
Holen Sie mit:
Hinweis:
--git-dir=foo.git
ist nicht erforderlich, wenn Sie zuerstcd
in das Verzeichnis wechseln.quelle
origin
können Sie dasorigin
Teil 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/*
Nach langem Herumspielen habe ich festgestellt, dass dies für mich funktioniert.
Einmal:
Jedes Mal, wenn ich synchronisieren möchte:
quelle
git config remote.origin.fetch 'refs/heads/*:refs/heads/*'
) ist der Schlüssel. Gute Antwort, danke!git config remote.origin.fetch 'refs/heads/*:refs/heads/*'
die Antwort. Nachdem ich diesen Befehl gedrückt habe, kann ich einfachgit fetch
und das Repo wird mit dem Remote synchronisiert.Fügen Sie das nackte Repository als Remote-Repository hinzu und verwenden Sie es dann
git push
.quelle
Bei mir hat diese Kombination funktioniert:
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 )
quelle