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
Je dois toujours sur Google, mais la façon dont j'ai trouvé que cela fonctionne parfaitement (pour moi) est la suivante:
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.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.
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 .
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.*/===================================================================/"
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.
SVN ne peut probablement pas comprendre la sortie de git diff -p
, mais vous pouvez recourir à la force brute:
diff -r
sur les deux clones.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)
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
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.