2010-03-17 10 views
28

Realicé algunos cambios en un proyecto de código abierto sin tomarse el tiempo para crear los archivos de parche adecuados.Crear un archivo de parche desde un diff de 2 carpetas

Ahora, el responsable del proyecto lanzó una nueva versión, y entre los archivos nuevos y editados, hay un grupo 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.

+0

usaste 'git clone' para crear un repositorio local? – niry

+0

Desafortunadamente, la fuente original no está bajo git, se lanza en un paquete con cada nueva versión. Pero estoy usando git para mi versión. – karatchov

Respuesta

40

Si tiene dos directorios a y que b 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 

Suponga que tiene directorios local (que contienen la versión local de upstream1.0), upstream1.0 y upstream1.1 . Para crear y aplicar los cambios a upstream1.1:

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

Consulte la documentación para el parche, y tratar de convencer a los mantenedores de fuente a utilizar git. Las cosas serán mucho más simples si puede usar las herramientas de git para trabajar con su repositorio local.

+5

'diff -urN b a> ba.diff' si creó archivos nuevos en * a * que no están en * b * –

+5

' diff -uarN b a> ba.diff' es mejor si existen archivos binarios en alguna parte. – lalebarde

10

Si el proyecto está en git y no ha confirmado sus cambios localmente, simplemente puede hacer git diff > file.patch para obtener datos pattable diff. 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 puedes probar usar el parche más tarde para aplicar el parche.

Sin embargo, considere usar las herramientas de git para fusionar sus cambios con la nueva versión, ya que git también puede rastrear los cambios de nombre de archivo. Tendrá que aprender mucho sobre git y le llevará algo de tiempo hacerlo bien: probablemente deba hacer una copia de seguridad de su trabajo antes de comenzar a jugar con él.

1

Puede intentar algo que me sugirieron aquí anteriormente, una solución "diferente" interesante: primero clone la última versión del proyecto. No debería tener ningún cambio local. Asegúrese de que la carpeta .git esté allí. Luego copie su árbol de trabajo, es decir todos sus archivos EXCEPTO la carpeta .git, al repositorio clonado. Ahora si escribe "git st" verá todo lo que ha cambiado. Tendrá que ordenar también el espaciado y las terminaciones 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 de archivos, si escribe git diff verá sus cambios.

Luego, editaba los archivos uno por uno, hasta que git st se parece a lo que quiero comprometer.

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

4

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

Importe 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 los 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 

A continuación, actualizar 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 de git, ahora es el momento de comenzar a tratar de fusionar su cambios:

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

Buena suerte ...

Si desea fusionar archivos manualmente, realmente recomiendo usar KDiff3. Suponiendo Archivo1.c es de código abierto-proyecto-0,1, Archivo2.c de código abierto-proyecto-0,2 y Archivo3.c de sus cambios, ejecute

kdiff3 -o merged_file.c file1.c file2.c file3.c 
0

Probablemente esté consultando git rebase. Tal vez incluso un simple git pull hará lo que quiera.

Cuestiones relacionadas