Extrae el subdirectory git manteniendo el historial CON el cambio de nombre

Estoy dividiendo un gran tree fuente en dos componentes separados y un submodule compartido. Para prepararme para esta split, primero moví las cosas compartidas a un único directory "común", actualicé todas las references y realicé una confirmación. Hasta aquí todo bien. Ahora me gustaría extraer ese directory en un submodule.

Normalmente haria esto con

git filter-branch --subdirectory-filter 

Pero en este caso, toda la historia interesante sucedió fuera de ese subdirectory, por lo que la historia se pierde.

Entiendo que no tiene sentido save el historial completo, ya que eso no estaría filtrando ningún dato en absoluto. Pero realmente no estoy buscando la posibilidad de retroceder en el time y build, solo quiero poder ver las confirmaciones de cada file.

¿Hay alguna manera de mantener el comportamiento de la twig de filter mientras se mantiene el historial de los files individuales?

Realmente no. --subdirectory-filter es un caso especial en el sentido de que en realidad está modificando el contenido de los treees de manera significativa (ya que está moviendo las cosas uno o más niveles de anidamiento de directorys).

Como tal, no existe realmente una buena asignación entre los files que están fuera del subdirectory sobre el que se está filtrando y los treees que podrían almacenarse como parte de commits en el resultado.

Recuerde que filter-branch está reescribiendo completamente su historial: el resultado es un set de confirmaciones completamente nuevo, y no hay ningún "vínculo" con los commits anteriores, por lo que cualquier información adicional debe poder expressse como parte de los nuevos commits.

Así es como acabo de resolver un problema similar. Comencé un proyecto en un repository "misc" casi privado, renombré algunos files y luego quise upload el proyecto a GitHub en https://github.com/kragen/aikidraw .

 $ git clone misc aikidraw $ cat > aikidraw-wanted aikidraw.js aikidraw.html caposketchra.html caposketchra.js jquery-1.2.6.js ^D $ cd aikidraw $ git filter-branch --tree-filter 'bash -c "comm -23 <(/bin/ls | sort) <(sort ~/devel/aikidraw-wanted) | xargs rm -rf"' HEAD 

Eso parece haber funcionado bien hasta ahora, aparte de no eliminar files punto (como .git , bueno y .gitignore , malo) pero aparentemente mi versión de Git (1.6.0.4) no tiene git filter-branch --prune-empty Así que ahora clono el nuevo repository más pequeño (para que sea más rápido copyrlo a través de la networking) y copio el repository a otra máquina que tiene Git 1.7.2.5 en él:

 $ time git clone aikidraw aikidraw-smaller $ du -sh aikidraw/.git aikidraw-smaller/.git 8.6M aikidraw/.git 1.2M aikidraw-smaller/.git $ time rsync -Pav aikidraw-smaller panacea.canonical.org:devel/aikidraw/ real 1m23.251s 

Y luego en panacea.canonical.org:

 $ cd ~/devel/aikidraw/aikidraw-smaller # Oops. I hate rsync sometimes. $ git checkout # otherwise I get "Cannot rewrite branch(es) with a dirty working directory." $ git filter-branch --prune-empty HEAD $ cd ../.. $ mv aikidraw i-hate-rsync $ mv i-hate-rsync/aikidraw-smaller/ aikidraw 

Luego de vuelta a mi netbook:

 $ mv aikidraw aikidraw-big $ git clone panacea.canonical.org:devel/aikidraw $ du -sh aikidraw/.git 268K aikidraw/.git 

Ahora, si estuvieras haciendo esto con dos directorys en lugar de cinco, en este punto podrías cambiar el nombre de todo dentro del subdirectory restante en la raíz del repository, usando git mv . En mi caso, ya he hecho mi cambio de nombre.

 $ git remote add github [email protected]:kragen/aikidraw.git $ git push github master 

¡Espero que esto ayude!