tag - subir archivos git
Crear un archivo de parche desde un diff de 2 carpetas (5)
Realicé algunos cambios en un proyecto de código abierto sin tomarse el tiempo para crear los archivos de parche adecuados.
Ahora, el responsable 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.
Git tiene soporte para detectar el cambio de nombre de los archivos, así 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 actualizas 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 intentar fusionar los 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 que file1.c es de open-source-project-0.1, file2.c de open-source-project-0.2 y file3.c de sus cambios, ejecute
kdiff3 -o merged_file.c file1.c file2.c file3.c
Probablemente deberías estar mirando a git rebase
. Tal vez incluso un simple git pull
hará lo que quieras.
Puedes probar algo que me sugirieron aquí antes, una solución interesante y "diferente": primero clona la última versión del proyecto. No debería haber 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, en el repositorio clonado. Ahora si escribes "git st" verás todo lo que se cambió. 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 git st, si escribe git diff verá sus cambios.
Luego editaría los archivos uno por uno, hasta que git st se pareciera a lo que quiero confirmar.
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.
Si el proyecto está bajo git y no ha confirmado sus cambios localmente, simplemente puede hacer git diff > file.patch
para obtener datos de diferencia de git diff > file.patch
. Si ha confirmado los cambios localmente, puede hacer git log
para encontrar el commit antes que usted y luego 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 combinar sus cambios con la nueva versión, ya que git también puede hacer un seguimiento de 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.
Si tiene dos directorios a
y b
que son similares, y quiere que b
sea igual 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 sus cambios a upstream1.1
:
$ diff -ur upstream1.0 local > my.diff
$ cd upstream1.1
$ patch -i ../my.diff
Verifique la documentación para el parche, e intente convencer a los mantenedores de la parte alta para que usen git. Las cosas serán mucho más simples si puede usar las herramientas git para trabajar con su repositorio local.