tag - que es un repositorio git
¿Qué hay de malo con este filtro de manchas/limpieza de git? (1)
Veo algunos problemas aquí:
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.Su filtro limpio intenta redirigir stdin de
%f
.
Los datos de entrada ya estarán en stdin, no hay necesidad de redirigirlos.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.El comando sed en el filtro limpio usa
-n
. Su único resultado será el contenido del archivoankhsvnsection
(suponiendo que la entrada tiene una líneaGlobal
).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 deankhsvnsection
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