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