web-dev-qa-db-fra.com

Git format-patch pour être compatible svn?

Existe-t-il un moyen d'obtenir un patch créé avec git format-patch pour être compatible svn afin que je puisse le soumettre à un dépôt svn?

Je travaille sur un dépôt svn sur github et je veux soumettre mes modifications au dépôt principal. J'ai besoin de créer un correctif pour ce faire, mais le correctif ne peut pas être appliqué car les formats git corrigent différemment puis svn. Y a-t-il un secret que je n'ai pas encore découvert?

MISE À JOUR: Bien qu'il n'existe actuellement aucun script ou méthode git native pour le faire, j'ai réussi à trouver un article du début de cette année sur la façon d'accomplir manuellement cette. J'ai suivi les instructions et j'ai réussi à faire fonctionner mes correctifs git avec svn.

Si quelqu'un pouvait essayer d'écrire un script pour accomplir cela et contribuer au projet git, je serais très apprécié de tout le monde.

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

94
rip747

Je dois toujours sur Google, mais la façon dont j'ai trouvé que cela fonctionne parfaitement (pour moi) est la suivante:

  • Créez le patch avec git diff --no-prefix master..branch > somefile.diff, la partie master et la branche sont facultatives, cela dépend de la façon dont vous voulez obtenir vos différences.
  • Envoyez-le partout et postulez avec patch -p0 < somefile.diff.

Cela semble toujours bien fonctionner pour moi et semble être la méthode la plus simple que j'ai rencontrée.

87
Nicholas Smith

La réponse courte est patch -p1 -i {patch.file}.

Veuillez vous référer à ce blog pour plus de détails: Création de patchs Subversion avec git .

21
Wallace Wong

Voici un script d'aide pour faire un diff par rapport au dernier ensemble de modifications svn et au commit donné: 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.*/===================================================================/"
17
Christoph

Subversion <1.6 ne prend pas en charge les correctifs. Il semble que Subversion 1.7 permettra d'appliquer des correctifs et les extensions git/hg aux diff unifiés sont sur notre liste TODO.

10
Bert Huijben

SVN ne peut probablement pas comprendre la sortie de git diff -p, mais vous pouvez recourir à la force brute:

  1. Faites deux clones de votre repo
  2. En un seul clone, découvrez vos derniers trucs
  3. Dans l'autre clone checkout tout ce qui est équivalent au svn en amont. Si vous avez prévu à l'avance, vous avez une copie de svn en amont sur sa propre branche, ou vous avez marqué la dernière version de svn. Si vous n'avez pas planifié à l'avance, utilisez la date ou gitk pour trouver le hachage git SHA1 qui se rapproche le plus de l'état svn.
  4. Calculez maintenant un vrai patch en exécutant diff -r sur les deux clones.
10
Norman Ramsey

C'est en effet un demande de fonctionnalité début 2008

Linus Torvalds avait déclaré à l'époque:

Je dirais donc que vous avez besoin de quelque chose de plus fort pour dire "ne faites pas de différence git", et cela devrait également interdire la détection de renommer au minimum.
Franchement, tout programme qui est si stupide qu'il n'accepte pas les correctifs git actuels (c'est-à-dire TortoiseSVN), alors nous ne devrions pas simplement désactiver la partie la plus triviale de celui-ci. Nous devons nous assurer de ne pas activer aucune des extensions assez importantes:
même si ToirtoiseSVN les ignorerait, si les ignorer signifie qu'il comprend mal la différence, il ne devrait pas du tout être autorisé.

C'est peut-être pourquoi

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

a été introduit dans Git1.5.6 en mai/juillet 2008 (je ne l'ai pas testé cependant)

4
VonC

Assurez-vous que vos modifications sont validées et rebasées au-dessus de votre branche git locale, depuis git bash run:

git show --pretty >> myChangesFile.patch

0
Ismail Hawayel

La réponse acceptée fournie par Nicholas fonctionne bien, sauf lorsque a) des fichiers binaires existent dans le diff ou b) vous travaillez dans Windows Git et avez des répertoires avec des espaces. Pour résoudre ce problème, j'ai dû ajouter une commande imbriquée git diff pour ignorer les binaires et une commande sed pour échapper aux espaces. C'est un peu lourd à écrire, j'ai donc créé 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 vous tapez ensuite:

git svnpatch Feature123

... un fichier de patch Feature123.patch sera créé avec les différences entre la base de fusion de la branche master et de la branche Feature123.

0
Leandro Gomez