Crear un archivo de parche a partir de un diff de 2 carpetas


Realicé algunos cambios en un proyecto de código abierto sin tomarme el tiempo para crear archivos de parches adecuados.

Ahora, el mantenedor del proyecto lanzó una nueva versión, y entre los archivos nuevos y editados, hay un montón de archivos renombrados.

¿Cuál es la mejor manera de aplicar mis cambios a la nueva versión ?
Soy completamente nuevo en el uso de diff/patch, y si puedo hacerlo con git, sería mejor.

Author: karatchov, 2010-03-17

5 answers

Si usted tiene dos directorios a y b que son similares, y desea b a ser el mismo que a, puede crear y aplicar un parche con:

$ diff -ur b a > ba.diff
$ patch -i ba.diff

Supongamos que tiene directorios local (que contienen su versión local de upstream1.0), upstream1.0, y upstream1.1. Para crear y aplicar tus cambios a upstream1.1:

$ diff -ur upstream1.0 local > my.diff
$ cd upstream1.1
$ patch -i ../my.diff 

Compruebe la documentación para el parche, e intente convencer a los mantenedores del upstream para que usen git. Las cosas serán mucho más simples si puedes usar las herramientas de git para trabajar con su repositorio local.

 43
Author: William Pursell,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-11-05 18:02:11

Si el proyecto está bajo git y no ha confirmado sus cambios localmente, simplemente puede hacer git diff > file.patch para obtener datos de diferencias patchables. Si ha confirmado los cambios localmente, puede hacer git log para encontrar la confirmación antes que usted y que git diff commit_string > file.patch.

Si el proyecto no está bajo git, o si d/l fuente sin clonar el repositorio (como sugiere el título), puede usar diff -urN original_dir new_dir > file.patch para crear el archivo de parche. En ambos casos, puede intentar usar el parche más tarde para aplicar el parche.

Sin embargo, considere usar las herramientas de git para combinar tus cambios con la nueva versión, ya que git también puede rastrear los cambios de nombre de archivo. Necesitarás aprender mucho sobre git en sí, y te llevará algún tiempo hacerlo bien - probablemente deberías hacer una copia de seguridad de tu trabajo antes de empezar a jugar con él.

 10
Author: niry,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-03-17 08:08:23

Git tiene soporte para detectar el cambio de nombre de archivos, por lo que si tienes suerte te ayudará con eso. El siguiente es un borrador aproximado de lo que debe hacer.

Importa la versión original:

tar zxvf open-source-project-0.1.tar.gz 
mv open-source-project-0.1 open-source-project
cd open-source-project
git init
git add .
git commit -m "Initial checkin of open-source-project-0.1"
git tag open-source-project-0.1

Ahora puede aplicar sus cambios originales en una rama separada:

git checkout -b mychanges
cp /somewhere/where/your/changes/files/are/* .
git diff
git add .
git commit -m "My changes"
git tag my_changes_001

Luego se actualiza a la versión más reciente:

git checkout master
tar zxvf open-source-project-0.2.tar.gz 
mv open-source-project-0.2/* .
rmdir open-source-project-0.2
git add .
git commit -m "Update to open-source-project-0.2"
git tag open-source-project-0.2

Hasta ahora todo está registrado en el repositorio git, ahora es el momento de empezar a intentar fusionar tus cambios:

git checkout -b merge_test open-source-project-0.2
git pull . my_changes_001

Bueno suerte...

Si desea fusionar archivos manualmente, realmente recomiendo usar KDiff3. Asumiendo file1.c es de open-source-project-0.1, file2.c desde open-source-project - 0.2 y file3.c de sus cambios, ejecute

kdiff3 -o merged_file.c file1.c file2.c file3.c
 4
Author: hlovdal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-03-17 10:19:49

Podrías probar algo que me sugirieron aquí antes, una interesante solución "diffing": primero clona la última versión del proyecto. No debería tener ningún cambio local. Asegúrese de que el .la carpeta git está ahí. Luego copie su árbol de trabajo, que es todos sus archivos EXCEPTO el .carpeta git, al repositorio clonado. Ahora si escribes "git st" verás todo lo que se cambió. Tendrás que ordenar también el espaciado y los finales de línea (git config core.autocrlf ...) si git st informa archivos que realmente no tienen cambios en ellos.

Ahora para cada archivo en la lista git st, si escribes git diff verás tus cambios.

Entonces editaría los archivos uno por uno, hasta que git st se vea como lo que quiero confirmar.

No confiaría en hacer parches porque son extremadamente exigentes. Lo más probable es que obtenga un "no se puede aplicar el parche", mientras que la solución anterior le da una lista de cambios no escalonados que puede trabajar en cualquier orden que desee.

 1
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-03-17 09:50:27

Probablemente deberías mirar git rebase. Tal vez incluso un simple git pull hará lo que quieras.

 0
Author: Tallak Tveide,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-08-30 13:34:05