tipos tag repositorio qué que existen etiquetas crear cambiar git filter sed gitattributes

tag - que es un repositorio git



¿Qué hay de malo con este filtro de manchas/limpieza de git? (1)

Veo algunos problemas aquí:

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

  2. Su filtro limpio intenta redirigir stdin de %f .
    Los datos de entrada ya estarán en stdin, no hay necesidad de redirigirlos.

  3. El programa sed en el filtro clean usa el comando r para acceder a otro archivo.
    Parece que los filtros se ejecutan desde la raíz del árbol de trabajo, pero no estoy seguro si eso está garantizado.

  4. El comando sed en el filtro limpio usa -n . Su único resultado será el contenido del archivo ankhsvnsection (suponiendo que la entrada tiene una línea Global ).

  5. Algunas versiones de sed (al menos la (antigua) versión BSD en Mac OS X) no permiten espacios en blanco después del nombre de archivo del comando r (es decir, el espacio después de ankhsvnsection en el programa sed del filtro clean).

Después de agregar, cambiar o eliminar un filtro, probablemente necesite tocar , modificar o eliminar los archivos de árbol de trabajo antes de que Git aplique el filtro. El índice de Git registra el tiempo de modificación de los archivos de árbol 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é filtro 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 filtros.

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''"

Deseo aplicar este filtro en mi repositorio de git para eliminar una sección de un archivo de solución durante el proceso 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 filtro en mi .git / info / attributes

* .sln filter = SourceControlProvider

y he agregado estos comandos a mi configuración

$ 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 archivo de texto que se encuentra en el mismo directorio que el archivo * .sln