2012-03-01 21 views
5

Tengo una estructura de directorios en mi repositorio:git-filter-branch: salir de la estructura de directorios

|-repository/ 
| | |-repository/fileOne 
| | 
| |-subOne/ 
| | |-subOne/fileTwo 
| | 
| |-subTwo/ 
|  |-subTwo/fileThree 

Quiero mover el directorio subOne en un repositorio diferente. Para hacer eso, estoy separando subOne usando git-filter-branch así:

$ git filter-branch --subdirectory-filter subOne --prune-empty 

Esto me deja con una historia rama que tiene este aspecto:

$ git log --oneline 
0c0ea11 subOne history 
6318bba subOne history 
c96fddb Initial commit 

Esto es exactamente lo que quiero; desde otro repositorio puedo hacer un git fetch y git merge, que agrega subOne y el historial en el otro repositorio. Eso es genial.

Sin embargo, git-filter-branch ha eliminado subOne. Comprobación de la estructura de directorios en mi sucursal:

$ ls 
fileOne 
$ pwd 
/this/is/a/path/repository 

pwddebería leer: /this/is/a/path/repository, pero ls debe mostrar subOne dentro del repositorio. Lo que tengo en su lugar son los archivos de subOne movidos hacia arriba y el directorio eliminado.

¿Cómo puedo extraer subOne sin perder el directorio?

+0

Yo _think_ filter-branch podría llamar a 'sh' en lugar de a' zsh' – knittl

Respuesta

4

pwd debería leer:/this/is/a/path/repository, pero ls debería mostrar subOne dentro del repositorio. Lo que tengo en su lugar es que los archivos de subOne se movieron hacia arriba y el directorio eliminado.

Resulta que este es el funcionamiento por defecto de git-filter-branch --subdirectory-filter. Citando man git-filter-branch:

El resultado contendrá ese directorio (y sólo eso) como su raíz del proyecto.

Para solucionar este, quiero cambiar todo en / a /subdirectory. Por suerte, hay una pieza de código vudú de aspecto en man git-filter-branch, bajo EXAMPLES:

To move the whole tree into a subdirectory, or remove it from there: 
     git filter-branch --index-filter \ 
       'git ls-files -s | sed "s-\t\"*-&newsubdir/-" | 
         GIT_INDEX_FILE=$GIT_INDEX_FILE.new \ 
           git update-index --index-info && 
       mv "$GIT_INDEX_FILE.new" "$GIT_INDEX_FILE"' HEAD 

EDIT: esto no funcionará EN MAC OS X. Vea mi pregunta here para más información. BSD sed no es lo mismo que GNU sed, lo cual es molesto. Para ejecutar ese ejemplo en OS X, cambie sed a gsed; el filtro funciona bastante bien

+0

Use 'brew install gnu-sed' para obtener gsed en OSX – johnboiles

+0

O use' port installut coreutils' si prefiere MacPorts en OSX. –

Cuestiones relacionadas