2010-04-19 17 views
117

¿Cómo copio todos los archivos en un directorio de otra rama? Puedo hacer una lista de todos los archivos de ese directorio haciendoGit: copie todos los archivos en un directorio desde otra rama

git ls-tree master:dirname 

A continuación, puedo copiar todos los archivos de forma individual haciendo

git checkout master -- dirname/filename 

Sin embargo, el uso de comodines ha sido hasta ahora un total fracaso. Esto no hace nada:

git checkout master -- dirname/*.png 

Aunque supongo que puedo usar un script bash para hacer eso, tiene que haber una manera más fácil, ¿verdad?

Respuesta

167

Como usted no está tratando de mover los archivos de un lado en el árbol, usted debe ser capaz de simplemente obtener el directorio:

git checkout master -- dirname 
+0

¿Qué tal si quisiera conservar los mensajes de confirmación para los archivos copiados? – totels

+2

@totels, estrictamente hablando, no hay mensajes de confirmación asociados con los archivos; el mensaje de compromiso está asociado con el objeto de compromiso mismo. Esto es lo que supongo que quiere: 'git checkout master - dirname; git add dirname; git commit -c $ COMMIT_SHA1 --reset-author; 'donde' $ COMMIT_SHA1' podría ser como 'branch_a' y sería el objeto commit que tiene el mensaje de confirmación que desea. No sé de improviso cómo determinar mediante programación la confirmación con el cambio más reciente a 'dirname' –

+1

Esto tiene un efecto secundario muy extraño. Copia 'dirname', pero también copia los archivos que están en' .gitignore' de la rama 'master'. ¿Alguna idea de por qué es eso? – Milimetric

12

Si no hay espacios en los caminos, y está interesado, como si fue, en archivos de extensión específica solamente, puede usar

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

Es una pena que git no admita esta función directamente. Exactamente como el OP, hubiera pensado que sería algo así como 'git checkout master - * .c' –

Cuestiones relacionadas