¿Es esta una buena forma de crear un parche?

15

Me gustaría crear un parche de una gccrama específica comparándolo con los lanzamientos oficiales; así que cuando desempaquete el tarball de la versión estable, puedo aplicar el parche y obtener el equivalente de lo que estaba en esa rama específica.

Es la primera vez que necesito crear un parche, así que es la primera vez que hago esto y mi principal preocupación es obtener las opciones y el análisis correctos ya que estamos hablando de un software extremadamente importante.

diff -crB GccStable GccGit > /tmp/fromStabletoBranch.patch

¿Es esto suficiente y la mejor manera de hacerlo?

usuario2485710
fuente
Las buenas prácticas habituales aquí implican el control de versiones o alguna variante de estas. Esto incluye, mercurial, git y sus extensiones de cola de parche asociadas. También podrías considerar la colcha. ¿Quizás podría entrar en más detalles sobre lo que está tratando de hacer?
Faheem Mitha
@FaheemMitha, ¿qué quieres decir con "más detalles"? Tengo una versión del gccoficial estable tar.bz2y otra versión inestable del mismo desde un gitrepositorio, me gustaría crear un parche, por supuesto, me gustaría compararlo solo con la masterrama, no con todo el repositorio.
user2485710
OK, bueno, seguro que puedes usar algo tan simple como diff. pero generalmente es preferible usar el control de versiones. Por un lado, hace que sea mucho más difícil perder la noción de lo que está haciendo.
Faheem Mitha
@FaheemMitha No entiendo lo que estás sugiriendo, mi tar.bz2claramente no es un gitrepositorio, ¿cómo crees que debo proceder?
user2485710
1
Realice una búsqueda para "crear parches utilizando el control de versiones". Dos respuestas anteriores que he escrito que están relacionadas son unix.stackexchange.com/a/127810 y unix.stackexchange.com/a/139817
Faheem Mitha

Respuestas:

20

Sí, esta es una buena manera de crear un parche.

En breve:

  1. Para crear un parche para un solo archivo, su comando puede verse como

    diff -Naru file_original file_updated > file.patch

    dónde

    • -N: trata los archivos ausentes como vacíos
    • -a: trata todos los archivos como texto
    • -r: compara recursivamente cualquier subdirectorio encontrado
    • -u: salida NUM (por defecto 3) líneas de contexto unificado
  2. Para crear un parche para todo el directorio:

    diff -crB dir_original dir_updated > dfile.patch

    dónde

    • -c: salida NUM (por defecto 3) líneas de contexto copiado
    • -r: compara recursivamente cualquier subdirectorio
    • -B: ignora los cambios cuyas líneas están en blanco

Después de todo para aplicar este parche, uno puede ejecutar

patch -p1 --dry-run < dfile.patch

donde switch le pindica al parche que elimine el prefijo de ruta para que los archivos se identifiquen correctamente. En la mayoría de los casos debería ser 1.

Elimine --dry-runsi está satisfecho con el resultado impreso en la pantalla.

jimmij
fuente
pregunta: ¿qué se supone que sucederá si un directorio o un archivo se elimina en dir_updatedcomparación con lo que había dir_original? ¿El diffse encarga de eso también o se salta?
user2485710
@ user2485710 diff ve qué archivos se eliminaron. file.patchen solo un archivo de texto, para que pueda abrirlo en cualquier editor o simplemente caty verá una línea comoonly in dir_original: missingfile.txt
jimmij
ok, pero luego patchborrará eso missingfile.txto qué más?
user2485710
Depende. Si desea eliminarlos, use diff -N ...como en mi primer ejemplo. Normalmente patcheliminará los archivos vacíos por defecto. Si no quieres, solo úsalo diff -crBcomo en tu pregunta. También en algunos casos (raros) se necesita la -Eopción de patchcomando para eliminar archivos vacíos, después del manual del parche:if the input is not a context diff or if patch is conforming to POSIX, patch does not remove empty patched files unless this option is given
jimmij
He ejecutado diff -Naru dir/file dir/file.new > diff.patchget can't find file to patch at input line 3con la patch -p0 --dry-run < diff.patchprimera línea de parche lee la --- dir/filesegunda +++ dir/file.newcon marcas de tiempo, la diferencia parece ser la correcta, ¿hay alguna opción para informar los nombres de archivo exactos que busca el comando?
ptica