remove - git tag push
Git: cómo forzar el conflicto de combinación y la fusión manual en el archivo seleccionado (2)
Mantenemos la aplicación web que tiene una rama maestra común y muchas ramas paralelas, una para cada instalación, cada una tiene pocos cambios específicos. El código fuente se gestiona en git y es una herramienta excelente cuando necesitamos funciones de transferencia y correcciones de errores de la rama principal en paralelo. Pero son pocos los archivos que son confidenciales y la fusión automática suele dar malos resultados. Por lo tanto, la fusión sería mucho más fácil si se pueden marcar de alguna manera y cada fusión daría lugar a un conflicto que requiere una fusión manual.
Busqué una respuesta:
- Estoy usando --no-commit y --no-ff merge options, pero no es lo mismo.
- Here y here alguien hace la misma pregunta pero sin solución.
- Un caso similar parece ser cómo evitar que el archivo se fusione utilizando .gitattributes que contenga: somefile.php merge = ours . Traté de encontrar alguna opción de combinación que generaría conflicto o forzaría la fusión manual, pero no encontré ninguna hasta el momento.
- .gitattributes que contiene: somefile.php -merge nunca se fusiona automáticamente y, por lo tanto, forza la fusión manual. Es una solución al 90%, pero lo que busco es probar la fusión automática y marcarla como conflicto independientemente de si tiene éxito o no. Pero esto es lo más cercano a la solución. (... gracias Charles Bailey por aclaración ...)
- Alguien sugiere escribir un controlador de combinación personalizado ( 1 , 2 ), pero no está claro cómo hacerlo.
editar: variante 4. descripción
La opción 5, un controlador de combinación personalizado, es probablemente la forma de acercarse más a lo que desea. Es sorprendentemente fácil de hacer. A continuación se muestra un ejemplo de uno que creo que debería acercarlo bastante al comportamiento que desea.
Primero, cree un script de combinación de controladores llamado merge-and-verify-driver
. Hágalo ejecutable y colóquelo en una ubicación adecuada (es posible que desee considerar la verificación de esta secuencia de comandos en el repositorio, incluso, ya que el archivo de configuración del repositorio dependerá de ello). Git va a ejecutar este script de shell para realizar la fusión de los archivos confidenciales:
#!/bin/bash
git merge-file "${1}" "${2}" "${3}"
exit 1
Esto solo hace el comportamiento de fusión predeterminado que normalmente hace Git. La diferencia clave es que la secuencia de comandos siempre devuelve un valor distinto de cero (para indicar que hubo un conflicto, incluso si la fusión se resolvió realmente sin conflictos).
Luego, debe decirle a Git sobre la existencia de su controlador de combinación personalizado. Usted hace esto en el archivo de configuración del repositorio ( .git/config
):
[merge "verify"]
name = merge and verify driver
driver = ./merge-and-verify-driver %A %O %B
En este ejemplo, puse merge-and-verify-driver
en el directorio de nivel superior del repositorio ( ./
). Tendrá que especificar la ruta de la secuencia de comandos en consecuencia.
Ahora, solo necesita dar a los archivos confidenciales los atributos adecuados para que el controlador de combinación personalizada se use al fusionar esos archivos. Agregue esto a su archivo .gitattributes
:
*.sensitive merge=verify
Aquí, le dije a Git que cualquier archivo con un nombre que coincida con el patrón *.sensitive
debería usar el controlador de combinación personalizado. Obviamente, debe usar un patrón que sea apropiado para su (s) archivo (s).
Nota: este artículo " Escribir un controlador de combinación git para archivos PO " ilustra el tipo de manipulación que puede realizar al fusionar manualmente un archivo: puede preprocesarlo para que su fusión manual tenga ciertos datos listos.
git merge-file
se puede usar, por ejemplo, para DECRYPT (y volver a cifrar) archivos antes de la fusión (!)
En su caso, al salir de su controlador de combinación con un estado que no sea 0, asegúrese de que la combinación sea manual.