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?

Respuestas:


289

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

git checkout master -- dirname

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')

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-ΕΨΗΕΛΩΝ
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.