Vous pouvez utiliser git checkout-indexpour 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.
Note mineure - vous avez besoin d'un chemin absolu car l'expansion du tilde du shell ne se produit pas, c'est-à-dire --work-tree=/home/thomasg/okcopyplutô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 statussorties en R'lyehian)
Tom Goodfellow
10
Cela fonctionne aussi comme prévu avec les anciens commits (par exemple, donnez un SHA à la place de HEAD), mais git statusaffiche alors beaucoup de mods (probablement parce que l'index correspond maintenant à l'autre répertoire et non à l'arbre de travail normal intact). git resetl'a remis en bon état.
Tom Goodfellow
2
La même chose ici git statusmontre beaucoup de mods et git resetn'aide pas. J'ai dû git checkout -f HEADrestaurer l'état de mon repo.
DUzun
11
FYI: vous devez créer le répertoire vous-même, sinon vous obtenez cette erreur:fatal: This operation must be run in a work tree
timaschew
13
Cela modifie de manière désastreuse l'index de l'arbre de travail principal, ce qui est généralement mauvais. Comme le suggère @TomGoodfellow, il git resetsuffit 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 archivesolution de Charles Bailey . De même, pour vérifier en toute sécurité plusieurs branches en même temps, la nouvelle git worktree addsous-commande est votre ami.
+1 et pour clarifier le "certain commit précédent" (au lieu de HEAD): Il se réfère au SHA1 IDqui 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 showsous - commande:git show 82e54378856215ef96c5db1ff1160a741b5dcd70:MyProj/proguard/mapping.txt > myproj_mapping.txt
ef2011
19
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 exporton entend être utilisé, d'ailleurs. git checkout-indexne 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 .gitrépertoire peut être supprimé si vous le souhaitez.
git --work-tree=/path/to/outputdir checkout <tag> -- .n'a pas fonctionné pour vous?
warvariuc
1
Non, ce n'est pas le cas. Le fichier réel dans le répertoire de travail d'origine est inchangé, mais la version intermédiaire est perdue et remplacée par la version de la balise. C'est particulièrement grave si la version intermédiaire contenait un ensemble de modifications soigneusement sélectionnées à valider. Je ne veux pas que la commande d'exportation touche mon index, point final.
proski
19
Si vous travaillez sous votre fonctionnalité et que vous ne souhaitez pas revenir à Master, vous pouvez exécuter:
Meilleure réponse - simple, et contrairement à 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).
Roger Dueck
Et comment annuler ce changement?
Scott P.
@ ScottP.just supprimer le myrepo_masterrépertoire
itsnikolay
1
annuler ceci est une sous-commande de worktree:git worktree remove ../myrepo_master
Martijn Dashorst
8
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.
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.
Utilisez git archive branch-index | tar -x -C your-folder-on-PCpour cloner une branche dans un autre dossier. Je pense que vous pouvez alors copier n'importe quel fichier dont vous avez besoin
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
,Pour citer les pages de manuel:
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.
Également à partir des pages de manuel:
la source
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:
Pour extraire un sous-répertoire ou un fichier de votre HEAD vers un répertoire spécifique:
la source
--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 lesgit 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 etgit 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èbregit archive
solution de Charles Bailey . De même, pour vérifier en toute sécurité plusieurs branches en même temps, la nouvellegit worktree add
sous-commande est votre ami.Pour un seul fichier:
la source
SHA1 ID
qui peut être facilement trouvé viagitk
. 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 lashow
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.Les nouvelles versions de git devraient prendre
git clone --branch <tag>
en charge l'extraction automatique de la balise spécifiée:la source
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:
Il créera un
../myrepo_master
répertoire avec desmaster
commits de branche, où vous pourrez continuer à travaillerla source
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épertoiregit 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.
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, avecHEAD~1
.git worktree prune
.la source
Ajout à la réponse de @ hasen . Pour répertorier les fichiers à extraire , vous pouvez utiliser
git ls-files
au lieu defind
comme:la source
-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é.
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
:la source
J'utilise cet alias pour extraire une branche dans un répertoire temporaire:
Usage:
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:
Cela se fait également automatiquement dans l'alias, avant d'ajouter un nouvel arbre de travail.
la source
Utilisez
git archive branch-index | tar -x -C your-folder-on-PC
pour cloner une branche dans un autre dossier. Je pense que vous pouvez alors copier n'importe quel fichier dont vous avez besoinla source