Extraire des fichiers Git vers un emplacement en dehors du référentiel
21
Est-il possible de «payer» à un emplacement en dehors du référentiel? Ce que je veux dire, c'est un clone d'une branche sans le répertoire «.git».
Par exemple: utilisez git pour gérer un site Web. Vous modifiez certains fichiers, vous les validez et les copiez sur un serveur Web via WebDAV. Le chemin WebDAV serait l'emplacement en dehors du référentiel, qui ne devrait pas contenir le «.git».
Ce n'est peut-être pas le problème pour lequel git a été construit, mais est-ce possible?
Disons que j'ai un référentiel nu nommé /srv/production.gitsur le système / serveur de destination.
Sur le système de destination, je peux utiliser la commande cd /srv/production.git; GIT_WORK_TREE=/srv/production-www/ git checkout -f
Si je suis dans un référentiel non nu, la commande est légèrement différente. Disons que j'ai un dépôt non nu à /srv/testing. Pour vérifier que j'utiliseraiscd /srv/testing/.git; GIT_WORK_TREE=/srv/production-www/ git checkout -f
En fait, sur mon système, j'automatise même cela dans un hook post-commit dans mon production.gitréférentiel. Ainsi, lorsque vous passez à production.gitla dernière version, vous passez automatiquement à la racine Web.
#!/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.
Si votre seul accès au système distant est webdav, il devrait certainement être possible d'écrire un hook post-commit qui sera extrait de l'hôte webdav, soit directement, soit vers un emplacement temporaire, que vous pourrez ensuite créer un script de téléchargement.
recherché à plusieurs endroits .. seule solution de travail, également propre!
karthikeayan
6
Si vous voulez juste les fichiers, vous pouvez les utiliser git archive. Habituellement, il écrit dans une archive comme tarballs ou ZIP, mais vous pouvez également le diriger:
git archive master | tar -x -C /some/path
Ici, c'est masterévidemment la branche que vous souhaitez archiver, et /some/pathne contiendra que les fichiers - non .gitou .gitignore.
Ou vous pouvez utiliser git checkout-indexce qui ressemble plus à une "extraction" de fichiers:
git checkout-index -f -a --prefix=/some/path/
Ici, l' -aoption indique gitde retirer tous les fichiers. Le préfixe sera ajouté à la sortie. Quelqu'un a également écrit un wrapper autour de cela pour donner un git export.
Je pense que vous rendez cela plus difficile que nécessaire. Il suffit de l'exécuter GIT_WORK_TREE=/destinationpath git checkout -fpendant que votre répertoire actuel est en haut d'un référentiel nu ou du sous-répertoire .git. Vous obtiendrez un paiement pour / destinationpath
Zoredache
Ok, je dois avoir en quelque sorte manqué cette option, +1 pour vous.
slhck
1
Je trouve cette option beaucoup plus intuitive, pour être honnête. Et moins sujet aux erreurs.
Si vous voulez juste les fichiers, vous pouvez les utiliser
git archive
. Habituellement, il écrit dans une archive comme tarballs ou ZIP, mais vous pouvez également le diriger:Ici, c'est
master
évidemment la branche que vous souhaitez archiver, et/some/path
ne contiendra que les fichiers - non.git
ou.gitignore
.Ou vous pouvez utiliser
git checkout-index
ce qui ressemble plus à une "extraction" de fichiers:Ici, l'
-a
option indiquegit
de retirer tous les fichiers. Le préfixe sera ajouté à la sortie. Quelqu'un a également écrit un wrapper autour de cela pour donner ungit export
.la source
GIT_WORK_TREE=/destinationpath git checkout -f
pendant que votre répertoire actuel est en haut d'un référentiel nu ou du sous-répertoire .git. Vous obtiendrez un paiement pour / destinationpath