extraer múltiples directorys usando git-filter-branch

Tengo un gran repository que actualmente contiene múltiples proyectos en subcarpetas de nivel superior, por ejemplo /a , /b , /c , y /d .

Ahora quiero dividir ese repository en dos repositorys diferentes: uno que contiene /a y /b y el otro que contiene /c y /d .

git filter-branch --subdirectory-filter , que es perfecto para extraer un solo directory, pero parece que no puede extraer varios directorys a la vez.

También conozco git filter-branch --prune-empty --tree-filter , que me permitiría eliminar todo, pero los dos directorys deseados. Esto no parece completamente correcto, ya que tengo que especificar manualmente todos los directorys de nivel superior que puedan existir.

¿Hay una mejor manera de extraer dos directorys de un gran repository?

PD: Por supuesto, cualquier buena solución que use algo distinto a git filter-branch está bien. 😉

Utilizar

 git filter-branch -f --prune-empty --tree-filter 'bash preserve-only.sh ab' -- --all 

donde preserve-only.sh es:

 IFS=':' GLOBIGNORE="$*" rm -rf * 

Esto debería eliminar todo less a y b de todas las confirmaciones de todas las twigs, lo que debería ser lo mismo que extraer exactamente los directorys proporcionados.

Para completar la split real, puede usar un filter como rm -rf ab para get todos los cambios no extraídos en la primera ejecución.


Actualización: Al tratar de acelerar las cosas con --index-filter llegué a una solución aún más fácil:

 git filter-branch -f --prune-empty --index-filter \ 'git rm --cached -r -q -- . ; git reset -q $GIT_COMMIT -- ab' -- --all 

Esto simplemente elimina todo y luego restaura los directorys dados después.

No conozco ninguna forma mejor que tree-filter para esto. Entonces ya tiene toda la información que necesita. ¡Ahora solo hazlo!

Comience creando sus dos twigs:

 git branch br1 git branch br2 

Ahora para cada twig, compruébalo y luego filtréalo usando el tree-filter .

Luego puede dividirlos en directorys separados, ya sea empujándolos o clonándolos o jalándolos.

prefiero esto

 git filter-branch -f --prune-empty --tree-filter "ls -I a -I b | xargs rm -rf" -- --all