2012-08-29 16 views
5

Tengo un proyecto de un agente SNMP donde los archivos MIB relacionados (archivos * .smiv2) se desarrollaron junto con él, pero ahora los quiero en un separar el repositorio git.Forma correcta de eliminar archivos no deseados con git filter-branch sin fallo de git rm

Para no perder el historial de los archivos MIB, ya que no comenzaron en el mismo directorio que están ahora, no pude usar --subdirectory-filter filter-branch, así que probé el enfoque --filter-index, basado en this question. La idea sería eliminar cada archivo que no termine con .smiv2 (obviamente en una nueva clonación del proyecto original, que se enviará a mi nuevo repositorio de MIB al final del proceso).

para hacerlo más simple, he elegido el uso de ls-files sobre ls-tree, así que en vez de:

git filter-branch --prune-empty --index-filter 'git ls-tree -r --name-only \ 
--full-tree $GIT_COMMIT | grep -v ".smiv2$" | xargs git rm --cached \ 
--ignore-unmatch -r' 

utilicé esta:

git filter-branch --prune-empty --index-filter 'git ls-files | \ 
grep -v ".smiv2$" | xargs git rm --cached --ignore-unmatch' 

pero ninguno de estos fracasado en la primera confirmación, ya que aparece git rm no fue alimentado en absoluto (supongo que --ignore-unmatch funcionará bien si los argumentos suministrados no se encuentran, pero no en el caso de que no se proporcionen argumentos):

$ git filter-branch --prune-empty --index-filter 'git ls-files | \ 
>  grep -v ".smiv2$" | xargs git rm --cached --ignore-unmatch' 
Rewrite 4cd2f1c98dbaa96bc103ae81fbd405bd1d991d9a (1/418)usage: git rm [options] [--] <file>... 

    -n, --dry-run   dry run 
    -q, --quiet   do not list removed files 
    --cached    only remove from the index 
    -f, --force   override the up-to-date check 
    -r     allow recursive removal 
    --ignore-unmatch  exit with a zero status even if nothing matched 

index filter failed: git ls-files | \ 
    grep -v ".smiv2$" | xargs git rm --cached --ignore-unmatch 

Lo tengo trabajo envolver git rm en un script que devuelve éxito, incluso cuando se produce un error debido a la falta de argumentos (guardado en /usr/local/bin/gitrm_alt):

#!/bin/sh 
git rm --cached --ignore-unmatch "[email protected]" 
exit 0 

y luego llamar a que en lugar de git rm:

git filter-branch --prune-empty --index-filter 'git ls-files | \ 
    grep -v ".smiv2$" | xargs gitrm_alt' 

pero me pareció extremadamente desagradable y torpe, así que me gustaría preguntar si hay una manera más directa/adecuada de hacerlo.

+0

Por qué no pasa un argumento ficticio extra que nunca existe en 'git rm---ignore unmatched', por ejemplo, '| xargs rm --cached --ignore-incomparable DoesNotExistInMyProject'? –

+0

jeje .. perfecto @ CharlesBailey, ¿cómo no pude ver eso? ¿No quieres convertir eso en una respuesta para poder aceptarlo? ¡Gracias! – Claudio

Respuesta

7

La solución más simple sería agregar un argumento ficticio a git rm para que siempre tenga al menos un parámetro de archivo.

E.g.

... | xargs git rm --cached --ignore-unmatch DoesNotExistInMyProject 
2

respuesta completa, para futuras referencias

git filter-branch --prune-empty --index-filter 'git ls-files | \ 
grep -v ".smiv2$" | xargs git rm --cached --ignore-unmatch DoesNotExistInMyProject' 
2

xargs 's -r | --no-run-if-empty indicador podría ser más limpio:

... | xargs--no-run-if-emptygit rm --cached --ignore-unmatched

0

Un interruptor -I también se puede utilizar.

some command | xargs -I % rm % 
Cuestiones relacionadas