Ich habe einen Server, auf dem ich ein Bare-Repository zum Pushen habe. Mein Server muss jedoch über eine funktionierende Kopie des Master-Zweigs verfügen.
Wie bekomme ich eine Arbeitskopie und das nur aus einem Bare-Repository?
Ich habe einen Server, auf dem ich ein Bare-Repository zum Pushen habe. Mein Server muss jedoch über eine funktionierende Kopie des Master-Zweigs verfügen.
Wie bekomme ich eine Arbeitskopie und das nur aus einem Bare-Repository?
Benutzer4815162342
Sie können das Repository einfach in ein anderes Verzeichnis auf derselben Maschine klonen:
git clone /bare/repo/dir
Das aktuelle Verzeichnis wird zu einem nicht nackten Klon Ihres Repos, und Sie erhalten einen Checkout der master
automatisch verzweigen. Verwenden Sie dann die üblichen Befehle wie git pull
um es bei Bedarf zu aktualisieren.
Als Nebeneffekt ist dieser Vorgang sehr effizient – wenn Sie ein lokales Verzeichnis angeben git clone
verwendet git Hardlinks, um die schreibgeschützten Teile der Objektdatenbanken der beiden Repos gemeinsam zu nutzen.
Was für Updates? Das geklonte Repository ist nur ein weiterer Klon, daher müsste sein Arbeitsbaum mit aktualisiert werden git pull
. Wenn Sie möchten, dass dies automatisch geschieht, können Sie die Server einrichten post-receive
Haken zum Ausführen von a git pull
auf dem Klon.
– Benutzer4815162342
16. September 12 um 21:09 Uhr
Ach richtig, offensichtlich. Ich habe zu viel an “Klonen” gedacht.
– Jonathan Allard
16. September 12 um 21:11 Uhr
Das Bare-Zielverzeichnis darf nicht auf enden .git
in welchem Fall git clone /bare/repo/dir
ist alles, was du brauchst.
– Hier
18. April 14 um 6:31 Uhr
@Brian Ich kann das mit Git 2.17.1 nicht reproduzieren. Ich habe ein Repository erstellt x
mit nur einem Commit (das eine Datei hinzufügt), dann habe ich es in ein leeres Repository geklont y
verwenden git clone --bare x y
. Nachdem ich das verifiziert habe y
War jetzt ein Bare Repo, habe ich endlich ausgeführt git clone y z
. Dies führte zu einem nicht nackten z
repo, dh eines, wo die master
Filiale wurde ausgecheckt. Wie für --local
das Handbuch sagt sogar ausdrücklich, dass “wenn das Repository als lokaler Pfad angegeben ist [which is the case in this answer]Dies [behavior specified by –local] ist der Standardwert, und –local ist im Wesentlichen ein No-Op.”
– Benutzer4815162342
28. Dezember 21 um 21:24 Uhr
@Brian Selbst wenn dies der Fall wäre, würde ich nicht erwarten --local
um zu beeinflussen, ob das Repository leer ist oder einen Checkout des Arbeitsbaums enthält. Komisch…
– Benutzer4815162342
28. Dezember 21 um 22:35 Uhr
Ein reines Repository ist nur das .git-Verzeichnis eines Arbeitsverzeichnisses und ein Eintrag in der lokalen Konfigurationsdatei. Was ich getan habe Konvertieren Sie ein leeres Repository in ein vollständiges ist:
.git
und verschieben Sie alle Dateien aus dem Bare-Repository dorthin.git/config
Datei zu ändern bare = true
zu bare = false
Sie könnten das Hidden-Attribut auf setzen .git
Verzeichnis unter Windows, aber nicht auf die Dateien im Verzeichnis.
Jonathan Allard
Ich suchte nach dem Ansatz “freistehender Arbeitsbaum” (wie gesehen Hier):
git init --bare
git config core.bare false
git config core.worktree /somewhere/else/
git checkout -f
Beachten Sie, dass Sie die ausführen müssen core.bare
Vor dem core.worktree
Linie, wie in den Kommentaren dieses Blogposts vermerkt (und gerade von mir bestätigt). Sonst bekommst du den Fehler fatal: core.bare and core.worktree do not make sense
.
– craigpatik
7. Februar 14 um 15:21 Uhr
Seltsam, ich auch: gist.github.com/joallard/8871673. Vielleicht hat sich das Verhalten in Git irgendwann geändert?
– Jonathan Allard
7. Februar 14 um 20:57 Uhr
Das sieht so aus nah dran zu dem, was ich brauche, aber Ihr Link ist defekt und die oben angegebenen Befehle sind nicht wirklich genug erklärt, dass ich sie an meine Bedürfnisse anpassen kann. Können Sie den Link reparieren und/oder erklären, was dort vor sich geht?
– Platzhalter
7. Dezember 15 um 18:54 Uhr
@Wildcard Rufen Sie mich heute Nachmittag im Chat an, ich werde versuchen, es mit Ihnen herauszufinden und meine Antwort zu aktualisieren, um vollständiger zu sein. (Ansonsten können Sie mir eine E-Mail hinterlassen, sie befindet sich auf meinem Github-Profil)
– Jonathan Allard
7. Dezember 15 um 20:09 Uhr
Danke für das Angebot! 🙂 Ich glaube, ich habe gefunden, was ich brauchte. Ich habe es auf SO nicht gefunden, also habe ich es hier gepostet, nachdem ich es herausgefunden hatte: stackoverflow.com/a/34143072/5419599
– Platzhalter
7. Dezember 15 um 21:01 Uhr
Das funktioniert bei mir:
git --git-dir=path-to-bare-repo.git --work-tree=path-to-target checkout master .
Dieser Befehl extrahiert alle Dateien aus dem Repository in das durch angegebene Verzeichnis path-to-target
Dies ist ein Riff von den anderen 2 Antworten, aber es füllt die Lücke für meinen Anwendungsfall – es funktioniert zum Aktualisieren des Repos vom Ursprung und zum Auschecken von Zweigen und allen Git-Vorgängen, da Sie am Ende ein normales vollständiges Git-Repo haben.
git clone /path/to/bare/repo /new/path/to/full/repo
cd /new/path/to/full/repo
git remote set-url origin [email protected]:swift/swift.git
Nachdem Sie diese 3 Codezeilen ausgeführt haben, können Sie dann git pull
und git branch
und git checkout some_branch
und so weiter, weil Sie jetzt ein normales vollständiges Git-Repo haben, das mit Ihrem Remote-Repo verbunden ist.
du bist der einzige, der some_branch erwähnt hat, solltest du näher darauf eingehen. Ich habe speziell versucht, ein Beispiel für Branche zu finden, und dieses hier war heiß auf Google für Branche und ist Teil von OQ. …
– blabla
30. August 16 um 4:43 Uhr
So funktioniert es:
$ git init --separate-git-dir /path/to/existing-bare-repository /path/to/workdir
$ cd /path/to/workdir
$ git checkout .
Voilà!
Zur Info: git init
werde melden: Reinitialized existing Git repository in /path/to/existing-bare-repository
. Aber seien Sie zuversichtlich. man git-init
sagt:
Das Ausführen von git init in einem vorhandenen Repository ist sicher. Es werden keine Dinge überschrieben, die bereits vorhanden sind.
Das ist die Magie git init
allein lässt Ihre Dateien nicht im Arbeitsverzeichnis erscheinen. Sie müssen das Stammverzeichnis auschecken.
du bist der einzige, der some_branch erwähnt hat, solltest du näher darauf eingehen. Ich habe speziell versucht, ein Beispiel für Branche zu finden, und dieses hier war heiß auf Google für Branche und ist Teil von OQ. …
– blabla
30. August 16 um 4:43 Uhr
kartisch
Sie können dafür ‘git show’ verwenden.
http://www.kernel.org/pub/software/scm/git/docs/git-show.html
Grundsätzlich:
git --no-pager --git-dir /path/to/bar/repo.git show branch:path/to/file.txt
.