Auschecken von Git-Dateien an einen Speicherort außerhalb des Repository

21

Ist es möglich, an einen Ort außerhalb des Repositorys „auszuchecken“? Was ich meine, ist ein Klon eines Zweigs ohne das Verzeichnis „.git“.

Zum Beispiel: Verwalten Sie eine Website mit git. Sie bearbeiten einige Dateien, schreiben sie fest und kopieren sie über WebDAV auf einen Webserver. Der WebDAV-Pfad wäre der Speicherort außerhalb des Repositorys, der kein ".git" enthalten sollte.

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

user240826
quelle

Antworten:

19

Ja, das ist sicherlich 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 bloßen Repository befinde, ist der Befehl etwas anders. Nehmen wir an, ich habe einen nicht leeren Aufbewahrungsort bei /srv/testing. Zum Auschecken würde ich das benutzencd /srv/testing/.git; GIT_WORK_TREE=/srv/production-www/ git checkout -f

Tatsächlich automatisiere ich dies auf meinem System sogar in einem Post-Commit-Hook in meinem production.gitRepository. Wenn Sie also auf production.gitdie neueste Version wechseln, werden Sie automatisch zum Webstamm ausgecheckt.

#!/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 Ihr einziger Zugriff auf das Remote-System webdav ist, sollte es auf jeden Fall möglich sein, einen Post-Commit-Hook zu schreiben, der entweder direkt oder an einem temporären Speicherort an den webdav-Host auscheckt und den Sie dann per Skript hochladen können.

Zoredache
quelle
an mehreren orten gesucht .. nur funktionierende lösung, auch sauber!
karthikeayan
6

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 leiten:

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 Folgendes verwenden, git checkout-indexdas einem "Auschecken" von Dateien ähnelt:

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

Hier wird die -aerzählt Option gitalle Dateien zu überprüfen. Das Präfix wird der Ausgabe vorangestellt. Jemand hat auch einen Wrapper geschrieben, um eine zu geben git export.

slhck
quelle
2
Ich denke du machst das schwieriger als es sein muss. Führen GIT_WORK_TREE=/destinationpath git checkout -fSie das Programm einfach aus, während sich Ihr aktuelles Verzeichnis oben in einem leeren Repository oder im Unterverzeichnis .git befindet. Sie erhalten einen Checkout nach / destinationpath
Zoredache
Ok, ich muss diese Option irgendwie verpasst haben, +1 für Sie.
Slhck
1
Ich finde diese Option viel intuitiver, um ehrlich zu sein. Und weniger fehleranfällig.
Minix