remove delete cleaner git git-svn git-rebase git-filter-branch

delete - extraer mĂșltiples directorios utilizando git-filter-branch



git rewrite file history (3)

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

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

Soy consciente de git filter-branch --subdirectory-filter , que es perfecto para extraer un solo directorio, pero parece que no puede extraer varios directorios a la vez.

También soy consciente de git filter-branch --prune-empty --tree-filter , que me permitiría eliminar todo, pero los dos directorios buscados. Esto no se siente del todo bien, ya que tengo que especificar manualmente todos los directorios de nivel superior que puedan existir.

¿Hay una mejor manera de extraer dos directorios de un gran repositorio?

PD: Por supuesto, cualquier buena solución que use algo que no sea git filter-branch está bien. ;)


No soy consciente de ninguna manera mejor que tree-filter de tree-filter para esto. Así que ya tienes toda la información que necesitas. Ahora solo hazlo!

Comience por crear sus dos ramas:

git branch br1 git branch br2

Ahora para cada rama, échale un vistazo, luego filtra con el tree-filter .

Luego, puede dividirlos en directorios separados, ya sea empujándolos hacia afuera o clonándolos o tirándolos.


Utilizar

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

donde preserve-only.sh es:

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

Esto debería eliminar todo excepto a y b de todas las confirmaciones de todas las ramas, lo que debería ser lo mismo que extraer exactamente los directorios dados.

Para completar la división real, puede usar un filtro como rm -rf ab para obtener todos los cambios que no se extrajeron en la primera ejecución.

Actualización: al intentar acelerar el uso de --index-filter , llegué a una solución aún más sencilla:

git filter-branch -f --prune-empty --index-filter / ''git rm --cached -r -q -- . ; git reset -q $GIT_COMMIT -- a b'' -- --all

Esto solo elimina todo y luego restaura los directorios dados después.


prefiero esto

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