2011-04-13 12 views
7

¿es posible con las herramientas de Git mover archivos a una nueva carpeta mientras modifica su historial completo, como si los archivos hubieran estado allí desde su primer complemento?Git: mover archivos en la historia también

Me surgió esto después de combinar algunos repositorios juntos: moví los archivos de varios repos a distintas carpetas dentro de un repositorio "super", sin embargo la historia combinada se comporta muy mal con herramientas git rebase y git svn ya que archivos totalmente diferentes pueden colisionar en sus antiguas ubicaciones, por supuesto.

Respuesta

6

Así que ahora esta en el trabajo bien:

git filter-branch --tree-filter '(ls -A; mkdir TheSubdir; echo TheSubdir) | xargs mv'

extraño pero agradable: la .git dir queda donde debe; tal vez git está impidiendo su movimiento de alguna manera?

+1

Los comandos de shell 'filtro' se ejecutan en un subdirectorio .git-rewrite por git, con nada más que los archivos de revisión actuales dentro. Guay. – dronus

5

Para modificar su historial completo, deberá volver a escribir cada confirmación. git filter-branch es la mejor manera de hacerlo. En particular, para su caso, git filter-branch --tree-filter some-command revisará cada versión de su historial, ejecute su comando en el que puede modificar el árbol de trabajo como mejor le parezca (como mover los directorios en cuestión), y luego reescribir ese compromiso para contener el nuevos contenidos del árbol.

+0

fresco Ok. Básicamente, 'git filter-branch' revisa cada revisión y la revisa nuevamente, reemplazando a la anterior. Suena raro, pensé que simplemente volvería a escribir los pathes almacenados ... De todos modos, ¡lo intentaré! – dronus

+0

@dronus Sí, eso es más o menos lo que hace. –

+0

@dronus En realidad, para su caso, en el que solo está moviendo cosas, debería poder hacer un 'git filter-branch --index-filter', que es como' --tree-filter' pero doesn En realidad, verifica los archivos, requiere que manipules todo en el índice directamente. Será más rápido de ejecutar que '--tree-filter', pero será un poco más difícil de escribir, ya que tendrá que modificar el índice directamente en lugar de simplemente mover archivos. Hay un ejemplo hacia el final de la documentación 'filter-branch' que muestra cómo hacerlo. –

0

El comando en el accepted answer fallará para los archivos/directorios que contienen espacios, etc. La siguiente versión es segura:

git filter-branch -f --tree-filter 'mkdir TheSubdir; \ 
find . -maxdepth 1 -name TheSubdir -prune -o -name . -true -o -print0 | \ 
xargs -0 mv -t TheSubdir' 
Cuestiones relacionadas