Ignorar un file versionado de un repository de Git y sus clones

Por alguna razón, me gustaría tener un file vacío en mi repository. El file debe existir, pero el process de compilation lo cambia, y no quiero que esos cambios se confirmen. Necesito que los usuarios que clonan mi repository ignoren también los cambios en este file.

git update-index --assume-unchanged parece bueno, pero solo funciona localmente.

¿Sabes cómo puedo resolver esto?

El enfoque de filter limpio mencionado por jthill es el enfoque correcto. +1

git filtro limpio

Obliga al file a restaurarse cada vez que se "agrega" al índice (lo que significa que nunca se agrega, ya que no ha cambiado).

Problema: ¿Cómo obligar a los usuarios a definirlo?

Solución: haga que clonen un repository de plantilla , que ya contiene:

  • ese file vacío,
  • y el file .gitattributes con el filter limpio declarado en él

Si configura su repository principal centralizado para denegar una actualización ref, que no es de avance rápido ( git config receive.denyNonFastForwards true ), sus usuarios no tendrán más remedio que enviar desde un repository con el mismo historial común que su plantilla repo.
Eso significa que tendrán esas configuraciones en su lugar.

Claro que podrían eliminar dicha configuration en una nueva confirmación, pero es entonces cuando se activan los ganchos pre-receive de la respuesta de jthill.
Si no necesitan conocer esos files, es probable que no se mezclen con lo que ya se definió para ellos.

Es fácil configurar un repository para preservar un estado comprometido particular para un file, y puede rechazar cualquier input que no le guste.

Para preservar un estado comprometido particular para un file:

 # do this once when the committed path/to/file is in the state you want x=`git rev-parse master:path/to/file` echo path/to/file filter=winetworking-to-$x >>.gitattributes # then in each repo that wants it git config filter.winetworking-to-$x.clean "git show $x" 

El gancho pre-receptor testing los empujes de input, este simple

 #!/bin/sh set -e while read old new ref; do git ls-tree $new path/to/file \ | awk '$3 != "e69de29bb2d1d6434b8b29ae775ad8c2e48c5391" { print "path/to/file is not empty"; exit 1; }' done 

rechazará cualquier inserción que contenga una sugerencia de bifurcación entrante con una ruta / file / no vacía. Sub en su "$ x" para verificar su estado deseado, y para mayor rigurosidad, puede recorrer todos los límites con un bucle de rev-list interno que alimenta al ls-tree.

Si no git add el file modificado, entonces no es un problema. Enséñales a no usar git add . y está cerca de equivalentes Diferencia de "git add -A" y "git add."

El proyecto README también podría include su git update-index --assume-unchanged instruction para el (los) file (s) relevante (s)

Esto parece ser la tarea de una aplicación en lugar de la de git. Agregaría este file a .gitignore y me aseguraré de que el process de compilation o cualquier otro process que lo use pueda crearlo.