¿Qué hay de malo con este filter de manchas / limpieza de git?

Deseo aplicar este filter en mi repository de git para eliminar una sección de un file de solución durante el process de pago y agregar esta sección durante la confirmación.

Esta es la sección que quiero eliminar o agregar:

GlobalSection(SubversionScc) = preSolution Svn-Managed = True Manager = AnkhSVN - Subversion Support for Visual Studio EndGlobalSection 

Configuré este filter en mi .git / info / attributes

* .sln filter = SourceControlProvider

y he agregado estos commands a mi configuration

 $ git config filter.SourceControlProvider.smudge "sed -e '/GlobalSection(SubversionScc)/,/EndGlobalSection/d' %" $ git config filter.SourceControlProvider.clean "sed -n -e '/^Global$/ r ankhsvnsection ' < %" 

Bueno, no funciona. ¿Qué he hecho mal?

ankhsvnsection es un file de text que se encuentra en el mismo directory que el file * .sln

Veo algunos problemas aquí:

  1. Tienes % al final de ambos filters.
    Esto no tiene ningún significado especial y se pasará como un argumento adicional a sed , lo que probablemente genere un error (a less que tengas un file llamado % ).
    Los filters deben ser "streaming" (leer de stdin y escribir en stdout). Su definición puede include %f , pero no debería tratarse como un file para leer o escribir; Git hace esa parte, los filters deberían leer de stdin y escribir en stdout.

  2. Su filter limpio intenta networkingirigir stdin de %f .
    Los datos de input ya estarán en stdin, no hay necesidad de networkingirigirlos.

  3. El progtwig sed en el filter clean usa el command r para acceder a otro file.
    Parece que los filters se ejecutan desde la raíz del tree de trabajo, pero no estoy seguro si eso está garantizado.

  4. El command sed en el filter limpio usa -n . Su único resultado será el contenido del file ankhsvnsection (suponiendo que la input tiene una línea Global ).

  5. Algunas versiones de sed (al less la (antigua) versión BSD en Mac OS X) no permiten espacios en blanco después del nombre de file del command r (es decir, el espacio después de ankhsvnsection en el progtwig sed del filter clean).

Después de agregar, cambiar o eliminar un filter, probablemente necesite tocar , modificar o eliminar los files de tree de trabajo antes de que Git aplique el filter. El índice de Git registra el time de modificación de los files de tree de trabajo; si no han cambiado, entonces Git traducirá git checkout -- file y git add file en un no-op.

Si desea ver el contenido real del índice (por ejemplo, para verificar qué filter limpio produjo), puede usar git show :0:path/from/repo/root/to/file . Usualmente no puedes usar git diff para esto ya que también aplica los filters.

Esto funcionó para mí:

 git config filter.SourceControlProvider.smudge "sed -e '/GlobalSection(SubversionScc)/,/EndGlobalSection/d'" git config filter.SourceControlProvider.clean "sed -e '/^Global\$/ r ankhsvnsection'"