tortoise subversion definicion svn git format-patch

subversion - svn windows



¿El parche de formato Git es compatible con svn? (8)

¿Hay alguna manera de hacer que un parche creado con git format-patch sea compatible con svn para poder enviarlo a un svn repo?

Estoy trabajando en un svn repo en github y quiero enviar mis cambios al repositorio principal. Necesito crear un parche para hacer esto, sin embargo, el parche no se puede aplicar ya que git formatea ese parche de manera diferente que svn. ¿Hay algún secreto que aún no haya descubierto?

ACTUALIZACIÓN: A pesar de que actualmente no existe un script o una forma nativa de git para hacer esto, logré encontrar una publicación de este año acerca de cómo lograr esto manualmente. He seguido las instrucciones y tuve éxito al obtener mis parches de git para que funcionen con svn.

Si alguien pudiera apuntar a escribir un guión para lograr esto y contribuir al proyecto de git, todos serían muy apreciados.

http://kerneltrap.org/mailarchive/git/2008/1/15/570308/thread#mid-570308


Aquí hay un script de ayuda para hacer una diferencia con respecto al último conjunto de cambios svn y la confirmación dada: http://www.mail-archive.com/[email protected]/msg00864.html

#!/bin/sh # # git-svn-diff # Generate an SVN-compatible diff against the tip of the tracking branch TRACKING_BRANCH=`git config --get svn-remote.svn.fetch | sed -e ''s/.*:refs//remotes////''` REV=`git svn find-rev $(git rev-list --date-order --max-count=1 $TRACKING_BRANCH)` git diff --no-prefix $(git rev-list --date-order --max-count=1 $TRACKING_BRANCH) $* | sed -e "s/^+++ .*/& (working copy)/" -e "s/^--- .*/& (revision $REV)/" / -e "s/^diff --git [^[:space:]]*/Index:/" / -e "s/^index.*/===================================================================/"


Asegúrate de que los cambios se hayan confirmado y actualizado en la parte superior de la rama de git local, desde git bash run:

git show --pretty >> myChangesFile.patch


De hecho, es una solicitud de función a principios de 2008

Linus Torvalds dijo en ese momento:

Entonces, yo diría que necesita algo más fuerte para decir "no haga un git diff", y eso tampoco debería permitir la detección de cambio de nombre como mínimo.
Francamente, cualquier programa que sea tan estúpido como para no aceptar los parches de git actuales (es decir, TortoiseSVN), entonces no deberíamos simplemente desactivar la parte más trivial de él. Deberíamos asegurarnos de no habilitar ninguna de las extensiones más importantes:
incluso si ToirtoiseSVN los ignoraría, si ignorarlos significa que no comprende la diferencia, no debería permitirse en absoluto.

Esa puede ser la razón

git-format-patch: add --no-binary to omit binary changes in the patch.

se introdujo en Git1.5.6 en mayo / julio de 2008 (no lo he probado)


La respuesta aceptada provista por Nicholas funciona bien, excepto cuando a) existen archivos binarios en el diff ob) trabajas en Windows Git y tienes directorios con espacios. Para resolver esto, tuve que agregar un comando anidado git diff para ignorar los binarios y el comando sed para escapar de los espacios. Es un poco engorroso escribir, así que creé un alias:

[alias] svnpatch = "!f() { git diff --name-only --no-prefix master...$1 | grep -Ev /"//.sdf|//.Doc|//.dll|//.zip|//.exe/" | sed ''s_//s_//////// _g'' | xargs git diff --no-prefix master...$1 > $1.patch; echo "Created $1.patch"; }; f"

Si luego escribe:

git svnpatch Feature123

... se creará un archivo de parche Feature123.patch con las diferencias entre la base de fusión de la rama principal y la rama Feature123.



SVN probablemente no pueda entender la salida de git diff -p , pero puedes recurrir a la fuerza bruta:

  1. Haz dos clones de tu repos
  2. En un clon echa un vistazo a tus últimas novedades
  3. En el otro clon, checkout sea lo que sea equivalente al svn upstream. Si ha planificado con anticipación, tiene una copia de svn upstream en su propia rama, o ha etiquetado la última versión de svn. Si no ha planeado con anticipación, use la fecha o gitk para encontrar el hash git SHA1 que más se aproxima al estado svn.
  4. Ahora calcule un parche real ejecutando diff -r sobre los dos clones.

Siempre tengo que buscar esto en Google, pero la forma en que he encontrado que funciona perfectamente (para mí) es:

  • Cree el parche con git diff --no-prefix master..branch > somefile.diff , el maestro y la parte de sucursal son opcionales, depende de cómo quiera obtener sus diferencias.
  • Envíelo a donde sea y aplique con el patch -p0 < somefile.diff .

Siempre parece funcionar bien para mí y parece ser el método más simple que he encontrado.


Subversion <1.6 no tiene soporte de parches. Parece que Subversion 1.7 permitirá aplicar parches y las extensiones git / hg a diff unificado se encuentran en nuestra lista de TODO.