¿Puedo 'confirmar' un archivo e ignorar sus cambios de contenido?

Resuelto Derick Bailey asked hace 14 años • 5 respuestas

Cada desarrollador de mi equipo tiene su propia configuración local. Esa información de configuración se almacena en un archivo llamadodevtargets.rb que se utiliza en nuestras tareas de construcción de rake. Sin embargo, no quiero que los desarrolladores golpeen el archivo devtargets de otros.

Mi primer pensamiento fue poner ese archivo en el.gitignore lista para que no esté comprometido con git.

Entonces comencé a preguntarme: ¿es posible confirmar el archivo, pero ignorar los cambios en el archivo? Entonces, enviaría una versión predeterminada del archivo y luego, cuando un desarrollador la cambie en su máquina local, git ignoraría los cambios y no aparecería en la lista de archivos modificados cuando hagas un git status o git commit. .

¿Es eso posible? Sin duda sería una buena característica...

Derick Bailey avatar Jul 23 '10 22:07 Derick Bailey
Aceptado

Claro, hago exactamente esto de vez en cuando usando

git update-index --assume-unchanged [<file> ...]

Para deshacer y comenzar el seguimiento nuevamente (si olvidó qué archivos no fueron rastreados, consulte esta pregunta ):

git update-index --no-assume-unchanged [<file> ...]

Documentación relevante :

--[no-]assume-unchanged
Cuando se especifica este indicador, los nombres de objetos registrados para las rutas no se actualizan. En cambio, esta opción activa/desactiva el bit "asumir sin cambios" para las rutas. Cuando el bit "asumir sin cambios" está activado, el usuario promete no cambiar el archivo y permite a Git asumir que el archivo del árbol de trabajo coincide con lo que está registrado en el índice. Si desea cambiar el archivo del árbol de trabajo, debe desactivar el bit para informarle a Git. A veces esto resulta útil cuando se trabaja con un proyecto grande en un sistema de archivos que tiene lstat(2)llamadas al sistema muy lentas (por ejemplo, cifs).

Git fallará (con gracia) en caso de que necesite modificar este archivo en el índice, por ejemplo, al fusionarlo en una confirmación; por lo tanto, en caso de que el archivo que se supone no rastreado se modifique en sentido ascendente, deberá manejar la situación manualmente.

Fallar correctamente en este caso significa que, si hay algún cambio en el nivel superior de ese archivo (cambios legítimos, etc.) cuando realiza una extracción, dirá:

$ git pull
…
From https://github.com/x/y
   72a914a..106a261  master     -> origin/master
Updating 72a914a..106a261
error: Your local changes to the following files would be overwritten by merge:
                filename.ext
 

y se negará a fusionarse.

En ese punto, puedes superar esto revirtiendo tus cambios locales, esta es una forma:

 $ git checkout filename.ext

luego, vuelva a extraer y vuelva a modificar su archivo local, o podría configurarlo –no-assume-unchangedy podrá guardar y fusionar normalmente, etc. en ese punto.

Rob Wilkerson avatar Jul 23 '2010 16:07 Rob Wilkerson

La forma preferida de hacer esto es usar git update-index --skip-worktree <file>, como se explica en esta respuesta :

assume-unchangedestá diseñado para casos en los que resulta costoso comprobar si un grupo de archivos ha sido modificado; cuando configura el bit, git (por supuesto) asume que los archivos correspondientes a esa parte del índice no han sido modificados en la copia de trabajo. Así se evita un lío de llamadas a estadísticas. Este bit se pierde cada vez que cambia la entrada del archivo en el índice (es decir, cuando el archivo se cambia en sentido ascendente).

skip-worktreees más que eso: incluso cuando git sabe que el archivo ha sido modificado (o necesita ser modificado mediante un reinicio --hard o similar), fingirá que no lo ha sido, utilizando en su lugar la versión del índice. Esto persiste hasta que se descarta el índice.

Para deshacer esto, usegit update-index --no-skip-worktree <file>

Desde la versión 2.25.1 de git, esta tampoco es la forma recomendada, citando:

Los usuarios a menudo intentan utilizar los bits de asumir sin cambios y omitir el árbol de trabajo para indicarle a Git que ignore los cambios en los archivos de los que se realiza un seguimiento. Esto no funciona como se esperaba, ya que Git aún puede comparar los archivos del árbol de trabajo con el índice al realizar ciertas operaciones. En general, Git no proporciona una forma de ignorar los cambios en los archivos rastreados, por lo que se recomiendan soluciones alternativas.

Por ejemplo, si el archivo que desea cambiar es algún tipo de archivo de configuración, el repositorio puede incluir un archivo de configuración de muestra que luego se puede copiar con el nombre ignorado y modificarlo. El repositorio puede incluso incluir un script para tratar el archivo de muestra como una plantilla, modificándolo y copiándolo automáticamente.

Si tiene el control del repositorio, prefiera el método de esta respuesta .

1615903 avatar Apr 21 '2017 06:04 1615903

La práctica común parece ser crear un archivo devtargets.default.rb, confirmarlo y luego indicarle a cada usuario que copie ese archivo devtargets.rb(que está en la lista .gitignore). Por ejemplo, CakePHP hace lo mismo con su archivo de configuración de base de datos, que naturalmente cambia de una máquina a otra.

erjiang avatar Jul 23 '2010 15:07 erjiang