GitTip: Skip WorkTree. Este tip es simple y potente por partes iguales, lo que queremos conseguir es modificar un fichero local y que git no lo identifique como que ha sido modificado pese a estar ya trackeado.

 

GitTip: Skip WorkTree


Para el ejemplo tengo un fichero “config.txt” con el contenido: “secret”. Este fichero funciona bien en todos los entornos pero en local necesito cambiarlo para hacer pruebas. No hay problema, se modifica, se hacen las pruebas pertinentes, se hace revert y se sube.

El problema viene cuando ese fichero, por necesidades varias, tiene que estar modificado en tu local para que funcione y no debemos subirlo para no afectar a los demás, como podemos hacer eso?

Un compañero de Apiumhub (kudos Álvaro @alvarobiz) me comento acerca de el comando: “git update-index –assume-unchanged”, he de decir que cumplía con lo que necesitaba, modificar un fichero local y git no lo “detectaba”, podía seguir haciendo cambios en otros ficheros y commiteando ficheros con mi querido “git add .” sin preocuparme de nada.

En la siguiente imagen podemos ver cómo haciendo un “git status” nos muestra dos ficheros, config.txt y otrofichero.sh. Como hemos comentado, config.txt no queremos subirlo, es un cambio local y queremos despreocuparnos de él. Tras el siguiente comando “update-index” el fichero config.txt desaparece del working area.

Skip WorkTree

El fichero sigue existiendo sólo que git no va a refrescarlo a no ser que pasen 2 cosas:

  • Manualmente desactivemos el bit con el que hemos marcado ese fichero (assume-unchanged)
  • Hacer pull y ese fichero se haya modificado via upstream ← ¡DANGER!

Ante este último escenario, volvemos a preocuparnos del fichero, tenemos que revisar a cada pull si se ha quitado el bit o no con el comando “git ls-files -v”

Skip WorkTree

Aquí vemos que config.txt esta marcado con una “h” minúscula mientras que otrofichero.sh con una “H” en mayúscula. Esta letra es la representación del bit que diferencia entre un fichero cacheado por git y otro que no.

Apium Academy

En definitiva, este comando no sirve para nuestro caso de uso, leyendo la documentación, este comando sirve para marcar cómo no cached ficheros grandes y mejorar nuestra performance con git. Si lo que buscamos es que git no revise algún fichero concreto, la opción que buscamos es –skip-worktree:

Skip WorkTree

 

No voy a enrollarme mas, esta última opción es parecida a assume change solo que mantiene el flag ante los pulls. Assume-change se debería usar para ficheros grandes trackeados por git cómo SDKs y demás mientras que skip-worktree encaja más con cambios de configuración para pruebas locales y no preocuparnos de subirlos a nuestro repositorio remoto.

Dicho esto, os dejo unos alias de git muy útiles relacionados con el artículo. El propio nombre del alias define la acción que hace:

[alias]

   hide = update-index –skip-worktree

   unhide = update-index –no-skip-worktree

   unhide-all = ls-files -v | grep -i ^S | cut -c 3- | xargs git update-index

–no-skip-worktree

   hidden = ! git ls-files -v | grep ‘^S’ | cut -c3-

 

Suscríbete a nuestro newsletter para saber más sobre GitTip: “Skip WorkTree”.