2012-02-20 12 views
5

Tengo un repositorio de git y un parche muy antiguo (creado en 2007) que deseo aplicarle. El contenido del repositorio ha cambiado significativamente desde entonces, y cuando intento aplicar el parche, falla debido a conflictos.¿Cómo aplicar un parche muy antiguo en Git?

Me gustaría tratar los conflictos dentro de git, agregando el parche como una nueva rama y fusionándola de nuevo a la maestra. Pero para hacer eso necesito ubicar el primer compromiso que el parche pueda aplicar limpiamente. ¿Hay alguna manera fácil de hacer esto en git?

Respuesta

12

Usted debe ser capaz de hacer esto con git bisect: iniciar la bisección de forma normal, y luego usar:

git bisect run git apply --check ${patch} 

que va a utilizar ese comando - "se puede aplicar este parche" - para determinar si una revisión es bueno o malo, automáticamente. Poco después, debería aparecer la ubicación correcta.

Eso le dará el más reciente commit donde se aplicará el parche.

Si desea lo más temprano, ejecute una segunda bisección con "no se aplica" como prueba, entre el inicio del repositorio y el lugar donde se aplica con éxito.

+0

'git bisect' necesita una buena revisión, y si lo supiera, no tendría este problema. :( –

1

Si el parche registra la identidad de los blobs a los que se supone que se aplica, puede usar git apply --3way para recurrir a la fusión tripartita si los parches no se aplican limpiamente.

De man git apply:

-3, --3way

Cuando el parche no se aplica limpiamente, caer de nuevo de 3 vías se fusionan si el parche registra la identidad de la burbuja que se supone que aplicar a, y tenemos esos blobs disponibles localmente, posiblemente dejando los marcadores de conflicto en los archivos en el árbol de trabajo para que el usuario los resuelva. Esta opción implica la opción --index, y es incompatible con las opciones --reject y --cached.

Cuestiones relacionadas