Mantenemos una aplicación web que tiene una rama maestra común y muchas ramas paralelas, una para cada instalación, cada una tiene algunos cambios específicos. El código fuente se administra en git y es una herramienta excelente cuando necesitamos transferir funciones y corregir errores de la rama maestra a las paralelas. Pero son pocos los archivos que son sensibles y la fusión automática suele dar malos resultados. Por lo tanto, la combinación sería mucho más fácil si se pueden marcar de alguna manera y cada combinación resultaría en un conflicto que requeriría una combinación manual.
Busqué una respuesta:
- Estoy usando las opciones de combinación --no-commit y --no-ff , pero no es lo mismo.
- Aquí y aquí alguien hace la misma pregunta pero sin solución.
- Un caso similar parece ser cómo evitar que el archivo se fusione usando .gitattributes que contienen: somefile.php merge = our . Intenté encontrar alguna opción de fusión que generara un conflicto o forzaría la fusión manual, pero no encontré ninguna hasta ahora.
- .gitattributes que contienen: somefile.php -merge nunca se fusiona automáticamente y por lo tanto obliga a la fusión manual. Es una solución al 90%, pero lo que busco es probar la fusión automática y marcarlo como conflicto sin importar si es exitoso o no. Pero esto es lo más cercano a la solución. (... gracias Charles Bailey por la aclaración ...)
- Alguien sugirió escribir un controlador de combinación personalizado ( 1 , 2 ), pero no tengo claro cómo hacerlo.
editar: variante 4. descripción
git fetch
primero, luego usogit difftool <file> FETCH_HEAD
, para poder aplicar manualmente el cambio en la rama remota a la local.-merge
no le impide fusionar los archivos, solo le obliga a hacerlo manualmente, por ejemplo, con una herramienta de fusión. ¿No es esto lo que necesitas?-merge
in.gitatttributes
git merge
no hace nada y que todo el trabajo debe realizarse con la herramienta de combinación? Entonces, no hay <<<<< ===== >>>> para usar la herramienta de combinación, ¿verdad? ¿Y la solución de Dan proporciona esto?Respuestas:
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 controlador de combinación llamado
merge-and-verify-driver
. Hágalo ejecutable y colóquelo en una ubicación adecuada (es posible que desee considerar verificar este script en el repositorio, incluso, ya que el archivo de configuración del repositorio dependerá de él). Git ejecutará este script de shell para realizar la fusión de los archivos sensibles:Esto solo hace el comportamiento de fusión predeterminado que normalmente hace Git. La diferencia clave es que el script siempre devuelve un valor distinto de cero (para indicar que hubo un conflicto, incluso si la fusión se resolvió sin conflictos).
A continuación, debe informar a Git sobre la existencia de su controlador de combinación personalizado. Haz esto en el archivo de configuración del repositorio (
.git/config
):En este ejemplo, puse
merge-and-verify-driver
el directorio de nivel superior del repositorio (./
). Deberá especificar la ruta al script en consecuencia.Ahora, solo necesita dar a los archivos confidenciales los atributos adecuados para que se use el controlador de combinación personalizado al combinar esos archivos. Agregue esto a su
.gitattributes
archivo: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, necesita usar un patrón que sea apropiado para su archivo (s).fuente
Estos dos comandos parecen tener el mismo efecto que usar el controlador de combinación personalizado:
El primer comando detiene la fusión antes de la creación de la confirmación de fusión, y el segundo marca todos los archivos modificados en las dos ramas como un conflicto para resolver incluso si no había ningún conflicto originalmente.
fuente
Nota: este artículo " Escribir un controlador de combinación de git para archivos PO " ilustra el tipo de manipulación que puede realizar al combinar manualmente un archivo: puede preprocesarlo para que su combinación manual tenga ciertos datos listos.
git merge-file
se puede utilizar, por ejemplo, para DESCRIPTAR (y volver a cifrar) archivos antes de fusionarlos (!)En su caso, al salir de su controlador de combinación con un estado distinto de 0, asegúrese de que la combinación sea manual.
fuente