Evitar la fusión en la twig principal para un tipo de file – Git

Tengo un repository git con una twig de lanzamiento ("master") y algunas otras twigs para propósitos de desarrollo.

Siendo un proyecto integrado, hay algunos files .tbl que se generan o modifican en cada compilation. Necesito mantener los files tbl en la twig maestra no modificados (a less que haya una nueva versión) y, por lo tanto, evitar que la fusión con otras twigs modifique esos files tbl.

Ya traté de declarar files tbl como binarys o usando *.tbl merge=ours pero como se especifica en https://git-scm.com/docs/git-merge esto solo funciona en caso de conflicto.

¿Alguna vez alguien se encontró con una situación similar?

Git no tiene una estrategia de fusión para este caso.

Si no escribes tu propia estrategia de combinación, git merge -s ArenaLor invocará git-merge-ArenaLor , y tendrías que escribir ese command, pero luego haría lo que quisieras, como has observado, no hay manera de get Git realiza una fusión tripartita normal en la mayoría de los files pero siempre mantiene una versión particular de un set particular de files.

Fundamentalmente, la mayoría de las estrategias de combinación hacen lo siguiente:

  1. Identifica la confirmación de la base de combinación. Llamemos a esto commit B por conveniencia. B tiene un grupo de files guardados como instantáneas; desde aquí, las otras dos twigs divergen.
  2. Diff la base de fusión contra cada sugerencia de twig, para encontrar qué files se cambian en qué twigs. A modo de ilustración, es más sencillo llamar a los dos twigles L y R , para Izquierda y Derecha, o Local y Remoto, o los nuestros (no hay L en la palabra "nuestro", pero así es como funciona Git con el recursivo habitual) y resolver estrategias).
  3. Cree el nuevo commit-to-make tomando cada file de B (sin cambio en ninguna de las twigs), L (el file se cambia solo en nuestra twig local / izquierda), R (el file se cambia solo en su control remoto / derecho- twig lateral) o -si el file se cambia en las dos confirmaciones de la bifurcación- combinando los cambios.

La *.tbl merge=ours en un file .gitattributes solo afecta al paso 3, y solo si el file se cambia en ambas confirmaciones de bifurcación. Es decir, un controller de combinación solo se ejecuta si Git tiene que combinar los cambios . No importa si los cambios tienen conflictos; lo que importa es que tanto L como R han cambiado algún file F con respecto a lo que estaba en la combinación de fusión commit B.

Sin embargo, todas estas decisiones las toma la estrategia de fusión, de modo que si escribe la suya propia, puede tomar sus propias decisiones. Tenga en count que la estrategia -s ours es bastante diferente: en lugar de hacer los tres pasos anteriores, lo hace en un solo paso:

  1. Tome todos los files de L. Ni siquiera necesitamos encontrar B , o mirar los contenidos de R. Simplemente mantenga todo lo que está en el índice en este momento y realice una fusión con el padre 1 = L y el padre 2 = R.

Eso hace lo que quiere para sus files *.tbl , pero es incorrecto para todos sus otros files, por lo que no es adecuado aquí.

Puede establecer *.tbl merge=ours en el file .gitattributes y agregar la configuration global:

 git config --global merge.ours.driver true 

Solo conserva la versión del file *.tbl en la twig master para parte de las situaciones (como las dos primeras situaciones, como se muestra a continuación).

Cuando fusionas otras twigs en master , existen tres situaciones para el file *.tbl :

  • Tiene conflicto para el file *.tbl al fusionarse: eso significa que la versión del file *.tbl en otras twigs es diferente de la versión en la twig master . Ya que ha establecido estrategias de combinación para *.tbl como la nuestra. Entonces la versión de *.tbl en la twig master será ketp.
  • No cambió el file *.tbl en ambos lados: eso significa que las versiones del file *.tbl en master las otras twigs son las mismas, así que no se preocupe, el file *.tbl en la twig master se sobrescribe.
  • Cambie el file *.tbl solo en el lado de otras twigs: esto sobrescribirá el file *.tbl con la versión de las otras twigs, ya que la combinación de git utiliza la estrategia de fusión recursiva. Por lo tanto, debe cambiar el file *.tbl por la versión en la twig master . Para que pueda usar los commands a continuación:

     git merge branchname git checkout HEAD~ *.tbl git commit -m 'switch the file as the version on master' 

Por cierto, si el file *.tbl no es necesario para el control de versiones en twigs no maestras, solo puede administrar el file en la twig master .


O hay otra opción a la que puede hacer reference: administrar el file *.tbl en una twig separada (tal como la twig tbl ).

Incluso el file *.tbl se puede sobrescribir en la twig master , la versión en la twig tbl debe ser correcta. Cuando necesite una nueva versión, puede verificar la versión desde la twig tbl twig master :

 git checkout master git checkout tbl *.tbl git commit -m 'recovery the version as last release' 

Entonces puedes prepararte para la nueva versión.

Después de liberar en la twig master puede actualizar el file en la twig tbl :

 git checkout tbl git checkout master *.tbl git commit -m 'update the file with new release version on tbl branch'