Comment appliquer un correctif de différence sous Windows?

136

Il existe de nombreux programmes qui peuvent créer un correctif de différence, mais j'ai beaucoup de mal à en appliquer un. J'essaie de distribuer un correctif et j'ai reçu une question d'un utilisateur sur la façon de l'appliquer. J'ai donc essayé de le comprendre par moi-même et j'ai découvert que je n'en avais aucune idée, et la plupart des outils que je peux trouver sont en ligne de commande. (Je peux gérer une ligne de commande, mais beaucoup de gens seraient perdus sans une interface graphique agréable et conviviale. Donc, ce n'est pas bon à cette fin.)

J'ai essayé d'utiliser TortoiseSVN. J'ai le patch que je souhaite appliquer. Je fais un clic droit sur le patch, et il y a une option sous le sous-menu TortoiseSVN qui dit «Appliquer le patch». Tout ce qu'il fait, c'est ouvrir une fenêtre vide.

Alors j'ai essayé de frapper Open. Il a deux options: fusionner et appliquer un diff unifié. (Le correctif est au format diff unifié, heureusement.) Mais l'option Apply ne fonctionne tout simplement pas: elle demande le correctif et un dossier. D'une manière ou d'une autre, il a oublié de demander le fichier auquel appliquer le correctif! Donc TortoiseSVN ne fonctionne tout simplement pas. Existe-t-il un utilitaire basé sur l'interface graphique Windows qui prendra un correctif et un fichier et les appliquera correctement?

EDIT: En regardant les réponses jusqu'à présent, il semble que Tortoise ne le fera correctement que si c'est un fichier déjà versionné. Ce n'est pas le cas ici. J'ai besoin de pouvoir appliquer un correctif à un fichier qui n'est pas sorti d'un référentiel SVN. J'ai juste essayé d'utiliser Tortoise, car je sais que SVN utilise des différences et doit savoir à la fois les créer et les appliquer.

Mason Wheeler
la source
La réponse de WinMerge sonnait bien mais explique seulement comment créer un correctif, pas comment en appliquer un. TortoiseHG a un excellent moyen d'appliquer des correctifs, mais uniquement aux fichiers qui sont dans un dépôt hg, pour autant que je sache. Si le SVN TortoiseDiff externe ne peut pas le faire, je me demande si un outil GUI le peut.
Warren P
3
Wow, vous avez raison, la réponse courte est toujours non - du moins dans WinMerge. Demande de fonctionnalité sur WinMerge ici sourceforge.net/tracker/...
KCD

Réponses:

32

Appliquer le patch

Avec TortoiseMerge:

  1. Rechercher et ouvrir un répertoire de dépôt SVN existant
  2. Créez un nouveau répertoire nommé "merges", s'il n'existe pas déjà
  3. Copiez le fichier sur lequel vous souhaitez appliquer le fichier .patch
  4. AJOUTER et COMMIT au référentiel svn avant de passer à l'étape suivante
  5. Faites un clic droit sur les fusions et choisissez Appliquer le patch ...
  6. Double-cliquez sur le fichier dans la liste
  7. Le fichier patché avec diff s'affiche dans le volet droit
  8. Cliquez sur ce volet et appuyez sur Enregistrer ou exporter avec Fichier-> Enregistrer sous ...

Screeny alternative si vous ouvrez à partir de TortoiseMerge. Dans l'écran ci-dessous, le répertoire fait référence au répertoire "fusion" mentionné à l'étape 2 ci-dessus: Screeny

Capture d'écran de l'interface graphique WinMerge: Screeny

Shérif Md
la source
@WarrenP: oui, cela explique comment appliquer le patch en utilisant TortoiseMerge
Walter Stabosz
4
Mon commentaire avait du sens avant les modifications et n'a plus de sens après les modifications. Êtes-vous encore confus? L'horodatage de modification ci-dessus (24 mars '11) semble être incorrect, car l'OP a à nouveau modifié sa réponse depuis octobre 2011. Je pense que l'horodatage de mon commentaire est également erroné.
Warren P
9
@SheriffMd Vous ne recevez pas l'erreur "D: \ Le dossier n'est pas une copie de travail"?
onmyway133
1
@SheriffMd J'obtiens également le message "Le dossier ... n'est pas une copie de travail" - alors, comment est-il possible d'utiliser la fusion tortue pour appliquer un correctif à un fichier sans version?
Peter T.
1
@ onmyway133, j'ai reformulé les étapes. Reportez-vous aux étapes 2 et 4. Vous ne recevrez pas le message d'erreur «pas une copie de travail».
Sheriff Md
21

J'ai créé un outil Python pur juste pour ça. Il a un comportement multiplateforme prévisible. Bien qu'il ne crée pas de nouveaux fichiers (au moment de l'écriture de ceci) et qu'il ne dispose pas d'une interface graphique, il peut être utilisé comme bibliothèque pour créer un outil graphique.

MISE À JOUR : Il devrait être plus pratique de l'utiliser si Python est installé.

pip install patch
python -m patch
anatoly techtonik
la source
1
J'utilise beaucoup ça. Merci @techtonik. Des nouvelles pour le faire fonctionner avec Python3?
pelson
Exécutez le correctif d'installation de pip avec les droits d'administration pour vous assurer qu'il fonctionne.
Vertexwahn
@Vertexwahn est-ce sous Linux?
anatoly techtonik
Python fonctionne partout - je l'ai testé avec Windows 10
Vertexwahn
A travaillé sur Windows 10 lorsque le correctif git ne fonctionnait pas. Je vous remercie!
sqrl0
19

TortueMerge est un utilitaire séparé fourni avec TortoiseSVN.

Il peut également être téléchargé séparément dans l' archive TortoiseDiff.zip . Cela vous permettra d'appliquer des différences unifiées aux fichiers sans version.

Paul Shannon
la source
21
AFAIK cela ne peut pas appliquer de correctif sur un fichier non versionné.
pihentagy
Je n'ai pas eu de problème pour l'appliquer à un fichier non versionné.
Paul Shannon
d'autres veulent un peu: S.
UmNyobe
1
La version 1.8.7 donne une erreur indiquant que la destination n'est pas versionnée.
Nick Westgate
15

Je sais que vous avez dit que vous préféreriez une interface graphique, mais les outils en ligne de commande feront bien le travail. Voir GnuWin pour un portage des outils Unix vers Windows. Vous auriez besoin de la commande patch, évidemment ;-)

Cependant, vous pourriez rencontrer un problème avec la terminaison de la ligne. Le port GnuWin supposera que le patchfile a une terminaison de ligne de style DOS (CR / LF). Essayez d'ouvrir le patchfile dans un éditeur raisonnablement intelligent et il le convertira pour vous.

Sardaukar
la source
Bien placé. Je n'aurais pas pu comprendre le problème de terminaison de ligne sans ce commentaire.
Bryan
Une autre façon de traiter les fins de ligne est d'ajouter l'option "--binary" à la ligne de commande.
BeReal82
4
C'est ce qui m'a mis sur la bonne voie. Cependant, sous Windows 7 ou plus récent, vous devez mettre à jour le manifeste de patch.exe pour éviter que la fenêtre contextuelle UAC ne s'affiche à chaque fois. Voir cette page pour un guide pratique
Anttu
1
Même avec les correctifs UAC, la version GnuWin du correctif gâche les paramètres de sécurité des fichiers. La construction livrée avec git ne souffre d'aucun problème.
Artfunkel
8

Dans TortoiseSVN, l'application de patch fonctionne. Vous devez appliquer le correctif dans le même répertoire qu'il a été créé à partir de . Il est toujours important de garder cela à l'esprit. Alors, voici comment procéder dans TortoiseSVN:

Cliquez avec le bouton droit sur le dossier auquel vous souhaitez appliquer le patch. Il présentera une boîte de dialogue demandant l'emplacement du fichier de correctif. Sélectionnez le fichier et cela devrait ouvrir une petite fenêtre de liste de fichiers qui répertorie les fichiers modifiés, et cliquer sur chaque élément devrait ouvrir une fenêtre de différence qui montre ce que le correctif est sur le point de faire à ce fichier.

Bonne chance.

Dan
la source
8
Cela n'aide pas. Les fichiers de destination ne proviennent pas d'une archive SVN. (Voir la modification du message d'origine.)
Mason Wheeler
8

L'utilitaire patch.exe de l'installation de Git fonctionne sous Windows 10.

Installez Git pour Windows puis utilisez le"C:\Program Files\Git\usr\bin\patch.exe" commande pour appliquer un correctif.

Si un message d'erreur comme un Hunk #1 FAILED at 1 (different line endings).avait été obtenu sur la sortie lors de l'application d'un correctif, essayez d'ajouter le -l(qui est un raccourci pour le --ignore-whitespace) ou les --binarycommutateurs à la ligne de commande.

Evgeniy Generalov
la source
Cette question concerne principalement un outil GUI pour les utilisateurs occasionnels qui ne sont pas familiarisés avec les outils de ligne de commande typiques. Votre réponse serait plus utile si vous fournissiez au moins quelques exemples de commandes complets à titre d'exemple.
Álvaro González
Fonctionne avec le compositeur sous Windows 10.
ecdani
7

Vous pouvez utiliser ceci port natif Win32 de l'utilitaire de correctif.

Il vient avec une plus grande sélection d'autres utilitaires et contrairement à Cygwin et similaire, il n'a pas besoin de DLL ou similaire. Choisissez simplement le petit exécutable de votre choix et stockez-le où vous le souhaitez.

Utilisation simple:

patch.exe -i <patchfile>

Obtenez plus d'aide:

patch.exe --help
logisch
la source
4
J'ai des problèmes avec cela sur Windows 7: il ouvre une nouvelle fenêtre CMD et demande des privilèges administratifs lorsque j'essaye de courir patch.exe.
Roy Tinker
3
L'exécutable du correctif se trouve également dans le bundle Git pour Windows.
Snicksie
6
Si vous rencontrez des problèmes lors de l'exécution de patch.exe, vous pouvez le renommer en tout ce qui ne comprend pas patch. Windows considère que tous les ex avec le mot patchsont suspects.
wbond le
2

EDIT: En regardant les réponses jusqu'à présent, il semble que Tortoise ne le fera correctement que si c'est un fichier déjà versionné. Ce n'est pas le cas ici. J'ai besoin de pouvoir appliquer un correctif à un fichier qui n'est pas sorti d'un référentiel SVN. J'ai juste essayé d'utiliser Tortoise parce que je sais que SVN utilise des diffs et doit savoir à la fois les créer et les appliquer.

Vous pouvez installer Cygwin , puis utiliser l' outil de correction de ligne de commande pour appliquer le correctif. Voir aussi cette page de manuel Unix , qui s'applique au patch .

Brian Clapper
la source
4
Ouais, je pourrais. J'ai Cygwin, en fait. Je pourrais probablement faire fonctionner votre solution aussi. Je ne vais pas faire subir ça à mes utilisateurs. Vous avez une idée du nombre d'utilisateurs Windows de nos jours ne savent même pas ce qu'est une ligne de commande? : P
Mason Wheeler
2

Il semble que TortoiseSVN (TortoiseMerge) nécessite la ligneIndex: foobar.py dans le fichier diff / patch. C'est ce que j'avais besoin de faire pour faire fonctionner un fichier de correctif non-TortoiseSVN avec le clic droit de TortoiseSVN Appliquer le correctif commande .

Avant:

--- foobar.py.org   Sat May 08 16:00:56 2010
+++ foobar.py   Sat May 08 15:47:48 2010

Après:

Index: foobar.py
===================================================================
--- foobar.py
+++ foobar.py   (working copy)

Ou si vous connaissez la révision spécifique à partir de laquelle votre contributeur travaillait:

Index: foobar.py
===================================================================
--- foobar.py   (revision 1157)
+++ foobar.py   (working copy)
matt wilkie
la source
2

J'utilise MSYS2 depuis http://www.msys2.org/

Il offre de nombreux services publics comme patch, which, git,tree et beaucoup d' autres.

Après avoir installé MSYS2, exécutez simplement le gestionnaire de packages pour installer patch:

pacman -S patch
isapir
la source
Ceci est juste une manière compliquée d'installer un outil de ligne de commande. Je suppose que vous n'avez lu que le titre de la question et non la question elle-même. :)
Álvaro González
1

Le patch lui indique le fichier auquel appliquer. L'en-tête devrait ressembler à quelque chose comme (visualisez-le dans le Bloc-notes ou dans votre éditeur de texte préféré):

--- Folder/old_file
+++ Folder/new_file

Dans le cas d'un patch Subversion, vous auriez également des numéros de révision (puisque les noms de fichiers sont les mêmes).

Le correctif GNU vous permettra de remplacer ces noms, mais je ne connais aucun outil GUI pour faire de même. Je vérifierais avec les différents programmes diff - cependant, il ne semble pas que WinMerge prenne en charge l'application de correctifs.

Mark Brackett
la source
Non, il n'y a rien de tel en haut de mon patch. Êtes-vous en train de dire que le nom de fichier et le chemin doivent être inclus dans le diff lui-même? Qui a pensé ça? Que devez-vous faire si vous voulez distribuer un diff à quelqu'un qui pourrait avoir des choses installées dans d'autres dossiers?!?
Mason Wheeler
Le début du patch commence comme ceci: --- / +++ / @@ -6,12 +6,12 @@ Pas de nom de fichier ou quoi que ce soit. Comment un chemin intégré est-il censé fonctionner? Que faire si j'ai créé le correctif sur XP et que quelqu'un essaie de l'utiliser sur Vista (ou vice-versa) et que le chemin d'accès au dossier Documents est différent?
Mason Wheeler
1
Les noms de fichiers sont relatifs au répertoire racine du référentiel, donc les différences de structure de dossier XP / Vista n'ont pas d'importance. Et la raison d'avoir des noms de fichiers dans le patch est que la plupart des patchs affectent plusieurs fichiers.
David Z
Je vois. D'accord, cela a plus de sens. Merci d'avoir clarifié cela, David!
Mason Wheeler
1

Eclipse devrait pouvoir le faire, allez dans la perspective TeamSynchronize puis dans Projet-> Appliquer le correctif

José Ospina
la source
1

Pour les projets Java, j'ai utilisé NetBeans pour appliquer des fichiers de correctifs. Si le code Java que vous corrigez n'est pas déjà un projet NetBeans, créez un projet pour celui-ci. Pour créer un nouveau projet:

  • Sélectionnez le menu Fichier -> Nouveau projet
  • Dans la boîte de dialogue qui s'affiche, faites-en un projet d'application Java . Donnez-lui un nom dans la boîte de dialogue et cliquez sur Finish.
  • Cliquez avec le bouton droit sur le nom de votre projet et sélectionnez Propriétés dans le menu contextuel
  • Dans la boîte de dialogue qui s'affiche, sélectionnez Sources et ajoutez un dossier source . Accédez à votre source Java.

Maintenant que vous avez un projet, appliquez le patch:

  • Mettez en surbrillance votre projet pour le sélectionner
  • Dans le menu principal, sélectionnez le menu Outils -> Appliquer un patch de différence
  • Dans la boîte de dialogue qui s'affiche, recherchez votre fichier de patch, sélectionnez-le et appuyez sur le bouton Patch.

C'est tout. Votre patch doit être appliqué et vous devriez voir une fenêtre de comparaison montrant les modifications.

user1984699
la source
1

J'utilise déjà BeyondCompare (commercial) pour les différences et les fusions, et cet outil a également la capacité de créer, afficher et appliquer des correctifs.

Quarante deux
la source
1

Si vous utilisez Mercurial , cela se fait via "import". Donc, sur la ligne de commande, la hg importcommande, ou (vous pouvez trouver le--no-commit option utile), ou "Repository" => "Importer ..." dans Hg Workbench.

Notez que ceux-ci valideront les modifications par défaut; vous pouvez éviter cette hg import --no-commitoption si vous utilisez la ligne de commande, ou si vous avez utilisé Hg Workbench, vous trouverez peut-être utile d'émettre hg rollbackaprès la fusion.

Marc Gravell
la source
Exactement ce que je cherchais! Je me demandais comment éviter le commit.
Keshav
0

Lors de l'application de correctifs à l'aide de TortoiseSVN, j'enregistre généralement le chemin à la racine du référentiel extrait. Vous devriez alors pouvoir faire un clic droit sur le patch, aller dans le menu TortoiseSVN, et cliquer ApplyPatch. ApplyPatch doit déterminer automatiquement à quel niveau de la hiérarchie des répertoires le correctif a été créé.

Cependant, j'ai eu des problèmes dans le passé avec l'application de correctifs contenant de nouveaux fichiers ou impliquant des renommages de fichiers. Quel que soit l'algorithme utilisé par Tortoise pour cela, il ne semble pas très bien gérer ces scénarios. Unicode peut vous poser des problèmes similaires.

Tsellon
la source
0

Avez-vous deux moniteurs? J'avais le même problème avec TortoiseMerge et je me suis rendu compte que lorsque j'ai désactivé l'un des moniteurs, la petite fenêtre avec la liste des fichiers s'est affichée. J'espère que cela vous aide.

Bruno
la source
0

Si vous obtenez le message d'erreur "Pas une copie de travail", essayez de sélectionner un répertoire dans la boîte de dialogue TortoiseMerge qui est un répertoire de travail de SVN.

Vinod Dalvi
la source
0

Un port BusyBox pour Windows a à la fois une commande diff et une commande patch, mais ils ne prennent en charge que le format unifié.

Miaou
la source
0

Utilisez simplement:

patch -p0 < path-file.patch

n'oubliez pas d'exécuter cette commande uniquement à partir de l'emplacement du dossier où vous avez créé le patch.

Ashish Lohia
la source