Resuelve automáticamente conflictos de git en files binarys con una secuencia de commands

Tenemos muchas sucursales en muchos repositorys, y todas tienen files binarys (sé que es malo, pero tenemos que tenerlos). Eso significa que casi todas las fusiones o sincronizaciones entran en conflicto en esos files.

Creamos un script, que comstack el proyecto y crea esos files, y ahora solo lo ejecutamos cuando ocurren conflictos, anula los files de conflictos con los correctos, y los marcamos como resueltos.

Esto es genial y ahorra time, pero ahora quiero saber si hay una manera de hacer que Git lo haga por sí mismo. Significado, en lugar de '–ours' o '–theirs', elegir una lógica más compleja para resolver files en conflicto específicos (ejecutar un script que los anule)

¿Hay alguna forma de hacer esto? ¡Gracias!

Envuelva su script en un controller de combinación personalizado y marque sus files binarys para fusionarlos con ese controller. Lea la documentation de gitattributes para más detalles; a continuación se encuentra un extracto relevante ligeramente editado de este:

Realizar una fusión de tres vías

merge La merge attributes afecta cómo se combinan tres versiones de un file cuando es necesaria una fusión a nivel de file durante la git merge , y otros commands como git revert y git cherry-pick .

Cuando este atributo se establece en una cadena, la fusión de 3 vías se realiza utilizando el controller de combinación personalizado especificado. El controller integrado de combinación de 3 vías se puede especificar explícitamente al solicitar el controller "de text"; el controller incorporado "tomar la twig actual" se puede solicitar con "binary".

Definición de un controller de combinación personalizado

La definición de un controller de combinación se realiza en el file .git/config , no en el file gitattributes .

Para definir una filfre de controller de combinación personalizada, agregue una sección a su $GIT_DIR/config (o file $HOME/.gitconfig ) como este:

 [merge "filfre"] name = feel-free merge driver driver = filfre %O %A %B %L %P recursive = binary 

La variable de merge.*.name Le da al controller un nombre legible para el ser humano.

El valor de la variable fusion del merge.*.driver Se usa para build un command para ejecutar para fusionar la versión de ancestro ( %O ), la versión actual ( %A ) y la versión de las otras twigs ( %B ). Estos tres tokens se reemplazan con los nombres de files temporales que contienen el contenido de estas versiones cuando se genera la línea de command. Además, %L se replaceá con el tamaño del marcador de conflicto (ver el atributo de conflict-marker-size ).

Se espera que el controller de combinación deje el resultado de la combinación en el file denominado con %A sobrescribiéndolo y salga con estado de cero si logró fusionarlos limpiamente, o no cero si hubo conflictos.

Por lo tanto, suponiendo que su controller de combinación se llama recompile_merge y desea que se aplique a los files * .o, necesitará la siguiente input en su file gitattributes :

  *.o merge=recompile_merge 

Un posible problema es asegurarse de que los files fuente correspondientes se fusionen antes que los files binarys que se deben fusionar de manera personalizada.