git filter no file 'no modificable'

Estoy trabajando con un IDE que produce una versión en algunos files de bibliotecas generados pero muy necesarios. Entonces, hay un problema si quiero usar la biblioteca con múltiples versiones o si veo un montón de cambios que de hecho no tienen sentido.

Resumen: quiero ignorar una sola línea de uno o varios files que pensé que los filters de git son el enfoque correcto. Puedo grep para la línea relevante sin ningún problema, ya que uno podría ver leyendo más.

Para resumir, configuré un filter de git para revertir cualquier modificación a la versión en el file de encabezado. (Tenga en count que puede haber diferentes modificaciones que son relevantes en este file).

 [filter "ignore-version"] smudge = cat %f || cat clean = git ls-files %f --error-unmatch >&- 2>&- \ && sed \"/version/c $(git show HEAD:%f | grep version)\" || cat 

(Agregué líneas de escape para una mejor lectura y cambié la palabra para que coincida con la simplicidad. En la versión original no hay colisiones posibles).

  1. git ls-files comtesting si el file ya está en el repository (actualmente HEAD )

1.1 si está presente, sed hará el trabajo sucio para replace toda la línea con la ya rastreada

1.2 De lo contrario, cat no hará nada más que continuar (esto debería garantizar que un file aún no rastreado no se perderá)

Hasta ahora, funciona. (Puedo vivir con el hecho de que el filter convierte silenciosamente todo CRLF a LF …)

Problema : el file fijo se marca como modificado por git, aunque el file más reciente del repository y la versión filtrada son binarys iguales. Lo comprobé usando kdiff como herramienta separada.


Edición 1 : Aquí hay un resultado que muestra la igualdad de las dos versiones de file:

 $ git show HEAD:file.txt | md5sum 9f95c28cebe4f45b8efb7b0ae64dfa56 $ cat file.txt | md5sum 894e7d1b28180b7a193bf3cdd6ceaacb $ cat file.txt | git ls-files file.txt --error-unmatch >&- 2>&- \ && sed \"/version/c $(git show HEAD:file.txt | grep version)\" || cat | md5sum 9f95c28cebe4f45b8efb7b0ae64dfa56 

Editar 2: Además, la salida de la diferencia …

 $ git diff file.txt warning: LF will be replaced by CRLF in file.txt. The file will have its original line endings in your working directory. 

Tenga en count que la versión registrada de este file contiene solo LF como en la confirmación anterior. Tenga en count también que la configuration core.autocrlf es verdadera sin tener nada más que la especificación del filter en el file .gitattributes .

Finalmente, lo resolví. El file de la pregunta estaba en un estado extraño, parece que la versión desprotegida tenía terminaciones de línea de estilo Unix, lo que no es correcto con respecto a la configuration de git (consulte el estilo de Windows, confirme el estilo de Unix). Después de organizar este file en particular, se eliminó instantáneamente del área de preparación sin ninguna mención y ahora se considera sin cambios. Así que creo que git limpió el file del directory de trabajo durante la puesta en escena (finales de línea) y ahora funciona.

Perdón por el ruido.


Pasos para verificar completamente el problema:

 git init echo "version=0.1" > file.txt echo "*.txt filter=ignore-version" > .gitattributes git config --local filter.ignore-version.clean 'git ls-files %f --error-unmatch >&- 2>&- \ && sed -b "/version/c $(git show HEAD:%f | grep version)" || cat' git config --local filter.ignore-version.smudge 'cat %f || cat' git add file.txt .gitattributes git commit -m "initial commit" # ----- echo "version=0.2" > file.txt git status 

El estado no debe informar ningún cambio. Me funcionó usar repositorys simples tanto en Linux como en Windows.