Git: copier tous les fichiers d'un répertoire depuis une autre branche

189

Comment copier tous les fichiers d'un répertoire à partir d'une autre branche? Je peux lister tous les fichiers de ce répertoire en faisant

git ls-tree master:dirname

Je peux ensuite copier tous les fichiers individuellement en faisant

git checkout master -- dirname/filename

Cependant, l'utilisation de caractères génériques a jusqu'à présent été un échec total. Cela ne fait rien:

git checkout master -- dirname/*.png

Bien que je suppose que je puisse utiliser un script bash pour le faire, il doit y avoir un moyen plus simple, non?

Alexenko
la source

Réponses:

289

Comme vous n'essayez pas de déplacer les fichiers dans l'arborescence, vous devriez pouvoir simplement extraire le répertoire:

git checkout master -- dirname
CB Bailey
la source
2
Et si je voulais conserver les messages de validation pour les fichiers copiés?
totaux du
2
@totels, à proprement parler, il n'y a pas de messages de validation associés aux fichiers; le message de validation est associé à l'objet de validation lui-même. C'est ce que je suppose que vous voulez: git checkout master -- dirname; git add dirname; git commit -c $COMMIT_SHA1 --reset-author;$COMMIT_SHA1pourrait être branch_aet serait l'objet de validation qui a le message de validation que vous voulez. Je ne sais pas de manière désinvolte comment déterminer par programme le commit avec la modification la plus récente dedirname
Alexander Bird
1
Cela a un effet secondaire très étrange. Il copie dirname, mais il copie également tous les fichiers qui se trouvent dans .gitignorela masterbranche. Une idée pourquoi c'est?
Milimetric
4
Un autre effet secondaire Je pense que si la branche actuelle a des fichiers supplémentaires qui ne sont pas dans la branche que vous extrayez (dans un dossier cible donné), cela les fusionnera fondamentalement - peut-être que c'est juste si l'un est un ancêtre? Je ne suis pas tout à fait sûr des conditions mais si vous avez 20 fichiers dans la branche A et 20 fichiers dans la branche B et que seulement 10 d'entre eux ont le même nom de fichier, vous vous retrouvez avec 30 fichiers (du moins dans mon cas où la branche A est l'ancêtre de la branche B)
codercake
@totels vérifie la commande git cherry-pick. Il applique les commits d'autres branches, mais uniquement les fichiers qui ont été modifiés dans le (s) commit (s) que vous voulez.
cs01
18

S'il n'y a pas d'espaces dans les chemins et que vous êtes intéressé, comme moi, par des fichiers d'extension spécifique uniquement, vous pouvez utiliser

git checkout otherBranch -- $(git ls-tree --name-only -r otherBranch | egrep '*.java')
test30
la source
4
C'est dommage que git ne supporte pas directement cette fonction. Exactement comme l'OP, j'aurais pensé que ce serait quelque chose commegit checkout master -- *.c
Gregory Kuhn
1
Cette réponse m'a aidé à répondre "Comment puis-je extraire des fichiers d'un modèle donné d'une autre branche vers ma branche de travail actuelle?"
usr-local-ΕΨΗΕΛΩΝ