¿Cómo incrustar un git-hash actualizado en Version.hpp?

Título original: ¿Cómo hacer que git ignore mi file independientemente de la bifurcación?

Tengo el siguiente file post-checkout que funciona como se esperaba:

#!/usr/bin/ruby cmd = ENV["HOME"] + "/dev/pitbull/cpp/bin/gen_version.rb --write" `#{cmd}` 

La secuencia de commands gen_version.rb determina una timestamp, la última label maestra y la HEAD git hash y escribe en un file VERSION.hpp que también está en git.

Luego uso use git update-index --assume-unchanged VERSION.hpp para hacer que git ignore mi cambio.

Ahora, esto funciona muy bien si permanezco en mi twig de desarrollo. Pero cuando bash un get checkout master , estoy jodido:

 git checkout master error: Your local changes to the following files would be overwritten by checkout: cpp/inc/core/util/VERSION.hpp Please, commit your changes or stash them before you can switch branches. Aborting 

¿Cuál es la configuration correcta de git para que pueda actualizar VERSION.hpp cuando lo hago, pero git ha ignorado cualquier cambio en este file, independientemente de mi twig?

EDITAR Cambié el tema ya que la solución final en realidad aborda un tema más amplio que puede ser más útil para más usuarios de SO. Para que pueda leer este tema de dos maneras: con el título original y la respuesta a continuación, o con el problema más amplio anterior, de nuevo con la solución completa a continuación.

Para abordar mi problema original: ¿Cómo hacer que Git ignore mi file independientemente de la bifurcación?

  1. git rm cpp / inc / core / util / VERSION.hpp
  2. agregue cpp / inc / core / util / VERSION.hpp a .gitignore

Para abordar: ¿Cómo incrustar un git-hash actualizado en Version.hpp?

Parte del problema es un problema de huevo de gallina en el que no puedes conocer tu hash hasta que todos los files estén registrados, pero no puedes registrar tu VERSION.hpp actualizada hasta que conozcas tu git-hash. Así que mi solución fue dejar VERSION.hpp fuera del repository y en el file .gitignore.

Tenga en count que el propósito de incrustar VERSION.hpp en el ejecutable: si aparece un error desagradable en la producción, con el git-hash en el binary, sabremos qué código extraer de git para que podamos depurar el código correctamente .

Estos son los pasos que tomé además de los dos pasos anteriores:

  1. Escriba un breve script de ruby ​​que haga dos cosas, dependiendo de si el área local está sucia o no (si git diff --shortstat muestra más de 0 líneas, tiene un área sucia). git rev-list HEAD | sed -n '1p' | cut -c1-10 git rev-list HEAD | sed -n '1p' | cut -c1-10 le dará los primeros 10 caracteres como git-hash. Si su área local está sucia, este es el git-hash de LAST HEAD (incrusto la cadena LAST dentro de VERSION.hpp). Si esto está limpio, es tu verdadero git-hash actual.
  2. La secuencia de commands de ruby ​​comprobará el resultado en 1. frente al file VERSION.hpp real. Si el resultado ha cambiado, escriba el nuevo resultado en VERSION.hpp.
  3. Modifique mi .bashrc, agregando dos alias pequeños – cmakerel y cmakedbg para llamar a cmake en mis directorys locales y de lanzamiento, pero antes de hacerlo hago cmake y hago en el alias, llamo al script de ruby ​​en 1. para actualizar mi VERSION.hpp si necesario.

Si llamo a cmakerel y cmakedbg ​​después de la extracción de git y si no modifico el código antes de la compilation (que de todos modos no debería hacer para una versión real), tendré la VERSION.hpp que necesito con toda la información adecuada embedded.

NOTA Una solución alternativa para modificar .bashrc con los alias es usar el gancho de post-checkout de git (en teoría). Sin embargo, no pude hacer que esto funcionara y ya había dedicado demasiado time a este problema, pero es posible que tenga más suerte.