filter-branch para eliminar el directory adicional

Estoy migrando varios repositorys de Subversion a Git, pero se configuraron un poco raros: la estructura estándar trunk / branches / tags vive en varios subdirectorys del repository. / branches y / tags están vacíos, por lo que la import de git-svn terminó con solo los directorys troncales.

svn/ proj1/ trunk/ src/ proj2/ trunk/ src/ 

Me gustaría usar git filter-branch para eliminar las carpetas de troncales adicionales, pero dejo el rest intacto:

 svn/ proj1/ src/ proj2/ src/ 

Basado en el último ejemplo en la documentation , esto es lo que tengo hasta ahora:

 git filter-branch --index-filter \ 'git ls-files -s | sed "s-/trunk/-/-" | GIT_INDEX_FILE=$GIT_INDEX_FILE.new \ git update-index --index-info && mv "$GIT_INDEX_FILE.new" "$GIT_INDEX_FILE"' HEAD 

Me parece que el sed está haciendo su trabajo, ya que esta input:

 100644 fa3dcf79717e9aca85ad745078a2fb2a2ce2b900 0 proj1/trunk/src/file1.txt 

Produce este resultado:

 100644 fa3dcf79717e9aca85ad745078a2fb2a2ce2b900 0 proj1/src/file1.txt 

Sin embargo, cuando ejecuto el command completo, aparece el siguiente error:

 Rewrite e00c119cfb755f741dc0e17c36d36bc2ddd27562 (1/42)mv: cannot stat `/c/dev/R epo/.git-rewrite/t/../index.new': No such file or directory index filter failed: git ls-files -s | sed "s-/trunk/-/-" | GIT_INDEX_FILE=$GIT_INDEX_FILE.new \ git update-index --index-info && mv "$GIT_INDEX_FILE.new" "$GIT_INDEX_FILE" 

¿Algunas ideas? Estoy usando git versión 1.7.3.1.msysgit.0 en Windows.

Actualización: ahora usando git versión 1.9.0.msysgit.0, una situación similar produce un error diferente (note .git-rewrite no existe antes de ejecutar el command):

 rm: cannot remove `c:/Path/to/svn/.git-rewrite/revs': Permission denied rm: cannot remove directory `c:/Path/to/svn/.git-rewrite': Directory not empty 

La misma corrección finalmente funcionó.

Lo descubrí basado en un comentario aquí . Parece ser un problema con la forma en que git-svn representa confirmaciones "vacías" (solo directory). Funciona bien si comienzo con una confirmación normal:

 git filter-branch --index-filter \ 'git ls-files -s | sed "s-/trunk/-/-" | GIT_INDEX_FILE=$GIT_INDEX_FILE.new \ git update-index --index-info && mv "$GIT_INDEX_FILE.new" "$GIT_INDEX_FILE"' 83df928c..HEAD 

Hmm. No puedo ver nada mal con lo que está ejecutando, y funciona bien para mí en un repository de ejemplo:

 $ git init
 Inicializó el repository vacío de Git en /Users/bcampbel/tmp/git-subdir/.git/
 $ mkdir -p proj1 / trunk
 $ echo "hello"> proj1 / trunk / test.txt
 $ git add.
 $ git commit -m "confirmación inicial"
 [maestro (confirmación de la raíz) cd431f3] confirmación inicial
  1 file cambiado, 1 inserciones (+), 0 eliminaciones (-)
  crear modo 100644 proj1 / trunk / test.txt
 $ echo "foo"> proj1 / trunk / another.txt
 $ git add.
 $ git commit -m "agregar un file"
 [maestro 84139f2] agregue un file
  1 file cambiado, 1 inserciones (+), 0 eliminaciones (-)
  crear modo 100644 proj1 / trunk / another.txt
 $ git filter-branch --index-filter \
 > 'git ls-files -s |  sed "s- / trunk / - / -" |
 > GIT_INDEX_FILE = $ GIT_INDEX_FILE.new \
 > git update-index --index-info &&
 > mv "$ GIT_INDEX_FILE.new" "$ GIT_INDEX_FILE" 'HEAD
 Reescribir 84139f26c7921721190b3c5dd57e2b49a41034aa (2/2)
 Ref 'refs / heads / master' fue reescrito
 $ ls proj1 /
 another.txt test.txt

Parece que, por alguna razón, el file index.new no se escribió en su sistema, o el command mv no lo pudo leer. No estoy seguro de por qué esto sería, pero me pregunto si puede deberse al hecho de que está usando msysgit en Windows. ¿Tienes una caja de Linux o una Mac que puedas probar?