Réponses:
Comme pour Faire un "git export" (comme "svn export")?
Vous pouvez utiliser git checkout-index
pour cela, c'est une commande de bas niveau, si vous voulez tout exporter, vous pouvez utiliser -a
,
git checkout-index -a -f --prefix=/destination/path/
Pour citer les pages de manuel:
Le "/" final [sur le préfixe] est important. Le nom exporté est littéralement précédé de la chaîne spécifiée.
Si vous souhaitez exporter un certain répertoire, il existe quelques astuces. La commande ne prend que des fichiers, pas des répertoires. Pour l'appliquer aux répertoires, utilisez la commande 'find' et dirigez la sortie vers git.
find dirname -print0 | git checkout-index --prefix=/path-to/dest/ -f -z --stdin
Également à partir des pages de manuel:
L'intuitivité n'est pas le but ici. La répétabilité est.
GIT_WORK_TREE=../path/to/place git checkout
git worktree
(voir ci-dessous) à mon humble avis est la réponse canonique aujourd'hui et pourrait être ajoutée ici.
Une autre solution qui est un peu plus propre - spécifiez simplement un arbre de travail différent.
Pour tout extraire de votre HEAD (pas d'index) vers un répertoire de sortie spécifique:
git --work-tree=/path/to/outputdir checkout HEAD -- .
Pour extraire un sous-répertoire ou un fichier de votre HEAD vers un répertoire spécifique:
git --work-tree=/path/to/outputdir checkout HEAD -- subdirname
--work-tree=/home/thomasg/okcopy
plutôt que --work-tree=~/okcopy
(éventuellement utiliser un chemin relatif tout en étant assis dans le même arbre git fonctionne aussi, mais de cette façon réside la folie et les git status
sorties en R'lyehian)
git status
affiche alors beaucoup de mods (probablement parce que l'index correspond maintenant à l'autre répertoire et non à l'arbre de travail normal intact). git reset
l'a remis en bon état.
git status
montre beaucoup de mods et git reset
n'aide pas. J'ai dû git checkout -f HEAD
restaurer l'état de mon repo.
fatal: This operation must be run in a work tree
git reset
suffit de restaurer l'arborescence de travail principale. Pour exporter en toute sécurité les sous-répertoires du référentiel dans n'importe quel SHA1, branche ou balise sans modifier l'arborescence de travail principale, consultez la tristement célèbre git archive
solution de Charles Bailey . De même, pour vérifier en toute sécurité plusieurs branches en même temps, la nouvelle git worktree add
sous-commande est votre ami.
Pour un seul fichier:
git show HEAD:abspath/to/file > file.copy
SHA1 ID
qui peut être facilement trouvé via gitk
. Si je n'ai besoin que de «récupérer» ce fichier vers un emplacement temporaire (c'est-à-dire sans revenir en arrière), j'utiliserais la show
sous - commande:git show 82e54378856215ef96c5db1ff1160a741b5dcd70:MyProj/proguard/mapping.txt > myproj_mapping.txt
Les solutions ci-dessus n'ont pas fonctionné pour moi car je devais vérifier une version spécifique balisée de l'arborescence. C'est ainsi que l' cvs export
on entend être utilisé, d'ailleurs. git checkout-index
ne prend pas l'argument tag, car il extrait les fichiers de l'index. git checkout <tag>
changerait l'index quel que soit l'arbre de travail, donc je devrais réinitialiser l'arbre d'origine. La solution qui a fonctionné pour moi était de cloner le référentiel. Le clone partagé est assez rapide et ne prend pas beaucoup d'espace supplémentaire. Le .git
répertoire peut être supprimé si vous le souhaitez.
git clone --shared --no-checkout <repository> <destination>
cd <destination>
git checkout <tag>
rm -rf .git
Les nouvelles versions de git devraient prendre git clone --branch <tag>
en charge l'extraction automatique de la balise spécifiée:
git clone --shared --branch <tag> <repository> <destination>
rm -rf <destination>/.git
git --work-tree=/path/to/outputdir checkout <tag> -- .
n'a pas fonctionné pour vous?
Si vous travaillez sous votre fonctionnalité et que vous ne souhaitez pas revenir à Master, vous pouvez exécuter:
cd ./myrepo
git worktree add ../myrepo_master master
git worktree remove ../myrepo_master
Il créera un ../myrepo_master
répertoire avec des master
commits de branche, où vous pourrez continuer à travailler
git --work-tree=/path/to/outputdir checkout HEAD -- .
cela ne fait rien à l'index, copie simplement la branche sélectionnée à l'emplacement spécifié (avec l'ajout d'un fichier .git).
myrepo_master
répertoire
git worktree remove ../myrepo_master
La réponse d'Adrian a jeté "fatal: Cette opération doit être exécutée dans un arbre de travail." Voici ce qui a fonctionné pour nous.
git worktree add <new-dir> --no-checkout --detach
cd <new-dir>
git checkout <some-ref> -- <existing-dir>
Remarques:
--no-checkout
Ne retirez rien dans le nouvel arbre de travail.--detach
Ne créez pas de nouvelle branche pour le nouvel arbre de travail.<some-ref>
fonctionne avec n'importe quelle référence, par exemple, avec HEAD~1
.git worktree prune
.Ajout à la réponse de @ hasen . Pour répertorier les fichiers à extraire , vous pouvez utiliser git ls-files
au lieu de find
comme:
git ls-files -z *.txt | git checkout-index --prefix=/path-to/dest/ -f -z --stdin
-z
! Bien que vous fournissiez un script qui n'est pas vulnérable à certains types d'attaques par injection.
J'ai défini un alias git pour y parvenir (avant de trouver cette question).
C'est une courte fonction bash qui enregistre le chemin actuel, passe au repo git, effectue une extraction et retourne là où il a commencé.
git checkpour développer ~ / mon_projet_git
Cela permettrait par exemple d'extraire la branche de développement dans le répertoire "~ / my_project_git".
Voici le code d'alias à l'intérieur ~/.gitconfig
:
[alias]
checkTo = "!f(){ [ -z \"$1\" ] && echo \"Need to specify branch.\" && \
exit 1; [ -z \"$2\" ] && echo \"Need to specify target\
dir\" && exit 2; cDir=\"$(pwd)\"; cd \"$2\"; \
git checkout \"$1\"; cd \"$cDir\"; };f"
J'utilise cet alias pour extraire une branche dans un répertoire temporaire:
[alias]
cot = "!TEMP=$(mktemp -d); f() { git worktree prune && git worktree add $TEMP $1 && zsh -c \"cd $TEMP; zsh\";}; f" # checkout branch in temporary directory
Usage:
git cot mybranch
Vous êtes ensuite déposé dans un nouveau shell dans le répertoire temporaire où vous pouvez travailler sur la branche. Vous pouvez même utiliser des commandes git dans ce répertoire.
Lorsque vous avez terminé, supprimez le répertoire et exécutez:
git worktree prune
Cela se fait également automatiquement dans l'alias, avant d'ajouter un nouvel arbre de travail.