2011-09-12 13 views
13

Estoy dividiendo un repositorio de Git usando la opción --subdirectory-filter de filter-branch, que funciona muy bien, excepto que arrastra todo a la raíz del repositorio.Filtro de subdirectorios Git con la estructura de directorios existente

Actualmente tengo

ABC 
    - DEF 
     - GHI 
     - JKL 
    - MNO 

Y el resultado de este comando:

git filter-branch -f --subdirectory-filter ABC/DEF --prune-empty -- --all 

Genera esto:

GHI 
JKL 

Cuando lo que realmente quiero es éste:

ABC 
    - DEF 
     - GHI 
     - JKL 

No puedo ver nada en los documentos de Git que muestra una opción de filtro que conserva (o establece) la estructura de directorios y no he podido encontrar un comando Puedo ejecutar después de el filtrado para reasignar la estructura a como lo quiero

¿Esto es posible?

Respuesta

3

Encontré una respuesta here que hace el truco.

El comando:

git filter-branch -f --index-filter 'git ls-files -s \ 
| sed "s-\t-&ABC/DEF/-" \ 
| GIT_INDEX_FILE=$GIT_INDEX_FILE.new git update-index --index-info \ 
&& mv $GIT_INDEX_FILE.new $GIT_INDEX_FILE' 

funciona perfectamente

+1

Worked perfectamente para mí también. Gracias por publicarlo Debo agregar que este comando no reemplaza el comando '--subdirectory-filter'; todavía ejecutas eso. Este comando reemplaza el comando 'git mv * ...' que otros documentos recomiendan. Pero sin la fea cometa masiva, el 'git mv' habría generado. –

+0

Lamentablemente, esto no funciona para mí. Estoy en Windows ejecutando git-bash, y falla diciendo que no puede encontrar index.new ($ GIT_INDEX_FILE.new). Ojalá pudiera usar esta solución. –

+0

@BerinLoritsch $ GIT_INDEX_FILE es una variable de entorno que la mayoría de las herramientas que he usado se configuran para usted; Tanto MsysGit como CygWin junto con varias alternativas de git bash para Windows. ¿Cuál es tu configuración exacta? – JRoughan

1

Sólo he dado esta prueba superficial mí mismo, pero creo que se puede utilizar con git filter-branch--tree-filter reescribir la rama, pero la eliminación de todos los archivos aparte de los que en el subdirectorio ABC/DEF, con algo parecido a lo siguiente:

git filter-branch --tree-filter \ 
    'find . -path ./ABC/DEF -prune -o -type f -print0 | xargs -0 rm -f' \ 
    --prune-empty HEAD 

Tenga en cuenta que el comando find solo elimina archivos, no directorios, pero como git no almacena directorios vacíos, esto aún debe producir el resultado que desea.

+0

Gracias por eso. Con el tamaño de este repositorio, realmente necesito algo que funcione fuera del índice (index-filter en lugar de tree-filter). Tu respuesta está definitivamente en el camino correcto, pero habría sido muy lenta en mi situación. Encontré una respuesta, pero no estoy seguro de la etiqueta de aceptar mi propia respuesta cuando esto probablemente sea adecuado para la mayoría de los casos. – JRoughan

+0

[Se recomienda contestar a su propia pregunta] (http://blog.stackoverflow.com/2011/07/its-ok-to-ask-and-answer-your-own-questions/) y si es la respuesta la que resolvió su pregunta debe aceptarlo también. Sin embargo, tiene que [esperar 48 horas] (http://blog.stackoverflow.com/2009/01/accept-your-own-answers/). El comando de la versión '-tree-filter' que probé anteriormente fue de hecho bastante lento, pero típicamente con filter-branch es algo único, así que no me importaría si tuviera que dejarlo funcionando durante la noche ... –

Cuestiones relacionadas