Erhalten einer Arbeitskopie eines Bare-Repositorys

Lesezeit: 5 Minuten

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?

Erhalten einer Arbeitskopie eines Bare Repositorys
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 cloneverwendet 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 --localdas 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:

  • Erstellen Sie ein neues Unterverzeichnis .git und verschieben Sie alle Dateien aus dem Bare-Repository dorthin
  • Bearbeiten Sie die .git/config Datei zu ändern bare = true zu bare = false
  • Schauen Sie sich die gewünschte Filiale an. Dadurch werden alle Dateien aus dem Repository in das Arbeitsverzeichnis extrahiert.

Sie könnten das Hidden-Attribut auf setzen .git Verzeichnis unter Windows, aber nicht auf die Dateien im Verzeichnis.

1644325211 338 Erhalten einer Arbeitskopie eines Bare Repositorys
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

Erhalten einer Arbeitskopie eines Bare Repositorys
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

.

822930cookie-checkErhalten einer Arbeitskopie eines Bare-Repositorys

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy