2010-04-19 3 views
117

Comment copier tous les fichiers d'un répertoire d'une autre branche? Je peux lister tous les fichiers dans ce répertoire en faisantGit: copie tous les fichiers dans un répertoire d'une autre branche

git ls-tree master:dirname 

Je peux ensuite copier tous les fichiers individuellement en faisant

git checkout master -- dirname/filename 

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

git checkout master -- dirname/*.png 

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

Répondre

167

Comme vous essayez de ne pas déplacer les fichiers autour de l'arbre, vous devriez être en mesure de la caisse tout le répertoire:

git checkout master -- dirname 
+0

Que faire si je voulais conserver les messages de validation pour les fichiers copiés? – totels

+2

@totels, strictement parlant, il n'y a pas de messages de validation associés aux fichiers; le message de validation est associé à l'objet commit lui-même. C'est ce que je suppose que vous voulez: 'git checkout master - dirname; git ajouter dirname; git commit -c $ COMMIT_SHA1 --reset-author; 'où' COMMIT_SHA1' pourrait ressembler à 'branch_a' et serait l'objet commit qui a le message de commit que vous voulez. Je ne sais pas comment déterminer par programmation le commit avec le changement le plus récent de 'dirname' –

+1

Cela a un effet secondaire très étrange. Il copie 'dirname' sur, mais il copie aussi tous les fichiers qui se trouvent dans le '.gitignore' de la branche' master'. Une idée de pourquoi c'est? – Milimetric

12

S'il n'y a pas d'espaces dans les chemins, et vous êtes intéressé, comme je était, dans les fichiers d'extension spécifique seulement, vous pouvez utiliser

git checkout otherBranch -- $(git ls-tree --name-only -r otherBranch | egrep '*.java') 
+2

Il est dommage que git ne supporte pas cette fonction directement. Exactement comme l'OP, j'aurais pensé que ce serait quelque chose comme 'git checkout master - * .c' –

Questions connexes