Pregunta

¿Hay alguna manera de obtener un parche creado con git formato de parche para ser compatibles svn para que pueda enviarlo a un repositorio SVN?

Estoy trabajando fuera de un repositorio SVN en github y quiere enviar mis cambios de nuevo al repositorio principal. Necesito crear un parche para hacer esto, sin embargo, el parche no se puede aplicar desde los formatos git que el parche de manera diferente a continuación, SVN. ¿Hay algún secreto que no he descubierto todavía?

ACTUALIZACIÓN: Aunque en la actualidad no existe un guión o git manera nativa para hacer esto, me las arreglé para encontrar un puesto de principios de este año acerca de cómo realizar manualmente esto. He seguido las instrucciones y tuvo un éxito conseguir mis parches git para trabajar con SVN.

Si alguien pudiera tomar una puñalada en escribir un guión para lograr esto y contribuir al proyecto Git, estoy todo el mundo sería muy apreciada.

http://kerneltrap.org/mailarchive/ git / 2008/1/15/570308 / hilo # 570308 mediados de

¿Fue útil?

Solución

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

  • Crear el parche con git diff --no-prefix master..branch > somefile.diff, el amo y sucursal parte son opcionales, depende de cómo se quiere conseguir sus diferenciaciones.
  • Enviar a donde quiera y aplicar con patch -p0 < somefile.diff.

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

Otros consejos

La respuesta corta es patch -p1 -i {patch.file}.

Por favor refiérase a este blog para más detalles: Creación de parches de Subversion con git .

Aquí hay un script de ayuda para hacer un diff contra el último conjunto de cambios SVN y el commit dado: http://www.mail-archive.com/dev@trafficserver .apache.org / 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.*/===================================================================/"

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

  1. Haga dos clones de tu repositorio
  2. En un clon echa un vistazo a su último material
  3. En el otro clon de pagar todo lo que es equivalente a la SVN aguas arriba. Si usted ha planeado con anticipación que tiene una copia de SVN aguas arriba en su propia rama, o si ha marcado la última versión SVN. Si usted no ha planeado con anticipación, utilice la fecha o gitk para encontrar el hash SHA1 git que más se aproxima al estado SVN.
  4. Ahora calcular un parche de bienes mediante la ejecución de diff -r lo largo de los dos clones.

Subversion <1.6 no tiene soporte parche. Parece que Subversion 1.7 permitirá aplicar los parches y las extensiones git / hg a diff unificado están en nuestra lista de tareas pendientes.

De hecho, es un solicitud principios de 2008

dijo Linus Torvalds en el momento:

  

Así que yo diría que se necesita algo más fuerte que decir "no hacer un git diff", y que también debe cambiar el nombre de no permitir la detección en un mínimo.
  Francamente, cualquier programa que es tan estúpida como para no acepta parches git actuales (es decir, TortoiseSVN), entonces muy bien que no sólo debe desactivar la parte más triviales de la misma. Debemos asegurarnos de que no habilita cualquier de las extensiones más importantes:
  incluso si ToirtoiseSVN ignoraría ellos, si ignorarlos significa que actúa mal entiende el diff, no se debe permitir en absoluto.

Tal vez por eso

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

se ha introducido en Git1.5.6 en mayo / julio de 2008 (no he probado, aunque)

Asegúrese de que sus cambios están comprometidos y porcentualizada en la parte superior de la rama local de Git, de ejecución fiesta git:

git show de --pretty >> myChangesFile.patch

La respuesta aceptada proporcionada por Nicholas funciona bien, excepto cuando exista a) Los ficheros binarios en el diff o b) que están trabajando en las ventanas de Git y tienen directorios con espacios. Para conseguir que se resolvió que tenía que añadir un comando anidado git diff para ignorar los binarios y comando sed para escapar de los espacios. Es un poco engorroso para escribir, por lo que crea 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 a continuación, escriba:

git svnpatch Feature123

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top