Checkout-Git-Dateien an einen Ort außerhalb des Repositorys

12425
user240826

Ist es möglich, an einen Ort außerhalb des Repositorys zu "checkout"? Was ich meine, ist ein Klon eines Zweiges ohne das Verzeichnis .git.

Beispiel: Verwenden Sie git zum Verwalten einer Website. Sie bearbeiten einige Dateien, legen fest und kopieren die Dateien über WebDAV auf einen Webserver. Der WebDAV-Pfad wäre der Ort außerhalb des Repositorys, der nicht das ".git" enthalten sollte.

Dies ist möglicherweise nicht das Problem, für das Git gebaut wurde, aber ist das möglich?

18

2 Antworten auf die Frage

17
Zoredache

Ja, das ist durchaus möglich.

Nehmen wir an, ich habe ein nacktes Repository /srv/production.gitauf dem Zielsystem / Server.

Auf dem Zielsystem kann ich den Befehl verwenden cd /srv/production.git; GIT_WORK_TREE=/srv/production-www/ git checkout -f

Wenn ich mich in einem nicht-leeren Repository befinde, ist der Befehl etwas anders. Nehmen wir an, ich habe ein nicht-nacktes Reservoir an /srv/testing. Zum checkout würde ich verwendencd /srv/testing/.git; GIT_WORK_TREE=/srv/production-www/ git checkout -f

Auf meinem System automatisiere ich dies sogar in einem Post-Commit-Hook in meinem production.gitRepository. Wenn Sie also zur production.gitneuesten Version wechseln, checken Sie automatisch zum Web-Root aus.

#!/bin/sh # # An example hook script that is called after a successful # commit is made. # # To enable this hook, rename this file to "post-commit".  GIT_WORK_TREE=/srv/production-www/ git checkout -f # ... misc other commands to verify permissions are set correctly. 

Wenn Sie nur über Webdav auf das Remote-System zugreifen, sollte es sicherlich möglich sein, einen Post-Commit-Hook zu schreiben, der entweder direkt oder über einen temporären Speicherort an den Webdav-Host auscheckt.

5
slhck

Wenn Sie nur die Dateien möchten, können Sie verwenden git archive. Normalerweise schreibt es in ein Archiv wie Tarballs oder ZIP, aber Sie können es auch weiterleiten:

git archive master | tar -x -C /some/path 

Hier ist masteroffensichtlich der Zweig, den Sie archivieren möchten, und /some/pathenthält nur die Dateien - nein .gitoder .gitignore.


Oder Sie können verwenden, git checkout-indexwas einem "Checkout" von Dateien ähnlicher ist:

git checkout-index -f -a --prefix=/some/path/ 

Hier können Sie mit der -aOption gitalle Dateien auschecken. Das Präfix wird der Ausgabe vorangestellt. Jemand schrieb auch einen Wrapper um dies zu geben git export.

I think you are making this more difficult than it needs to be. Just run `GIT_WORK_TREE=/destinationpath git checkout -f` while your current directory is at the top of a bare repository, or the .git subdirectory. You will get a checkout to /destinationpath Zoredache vor 10 Jahren 2
Ok, ich muss diese Option, +1 für dich, verpasst haben. slhck vor 10 Jahren 0
Um ehrlich zu sein, finde ich diese Option viel intuitiver. Und weniger fehleranfällig. Minix vor 5 Jahren 0