Git: copie todos los archivos en un directorio desde otra rama

189

¿Cómo copio todos los archivos en un directorio desde otra rama? Puedo enumerar todos los archivos en ese directorio haciendo

git ls-tree master:dirname

Entonces puedo copiar todos los archivos individualmente haciendo

git checkout master -- dirname/filename

Sin embargo, el uso de comodines hasta ahora ha sido un fracaso total. 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?

alexenko
fuente

Respuestas:

289

Como no está intentando mover los archivos en el árbol, debería poder retirar el directorio:

git checkout master -- dirname
CB Bailey
fuente
2
¿Qué pasa si quisiera retener mensajes de confirmación para los archivos copiados?
Toteles el
2
@totels, estrictamente hablando, no hay mensajes de confirmación asociados con los archivos; el mensaje de confirmación está asociado con el objeto de confirmación en sí. Esto es lo que supongo que desea: git checkout master -- dirname; git add dirname; git commit -c $COMMIT_SHA1 --reset-author;dónde $COMMIT_SHA1podría ser branch_ay sería el objeto de confirmación que tiene el mensaje de confirmación que desea. No sé de antemano cómo determinar mediante programación el compromiso con el cambio más reciente adirname
Alexander Bird
1
Esto tiene un efecto secundario muy extraño. Se copia dirname, pero también copia cualquier archivo que se encuentre en .gitignorela masterrama. ¿Alguna idea de por qué es eso?
Milimétrico
44
Otro efecto secundario, creo que si la rama actual tiene archivos adicionales que no están en la rama de la que está extrayendo (en una carpeta de destino determinada), básicamente los fusionará, ¿tal vez esto es solo si uno es un antepasado? No estoy exactamente seguro de las condiciones, pero si tiene 20 archivos en la rama A y 20 archivos en la rama B y solo 10 de ellos tienen el mismo nombre de archivo, terminará con 30 archivos (al menos en mi caso donde la rama A es el antepasado de la rama B)
codercake
@totels echa un vistazo al comando git cherry-pick. Aplica confirmaciones de otras ramas, pero solo los archivos que se modificaron en las confirmaciones que desea.
cs01
18

Si no hay espacios en las rutas y está interesado, como estaba yo, en archivos de extensión específica solamente, puede usar

git checkout otherBranch -- $(git ls-tree --name-only -r otherBranch | egrep '*.java')
test30
fuente
44
Es una pena que git no sea compatible con esta función directamente. Exactamente como el OP, hubiera pensado que sería algo asígit checkout master -- *.c
Gregory Kuhn el
1
Esta respuesta me ayudó a responder "¿Cómo puedo retirar archivos de un patrón dado de otra rama a mi rama de trabajo actual?"
usr-local-ΕΨΗΕΛΩΝ