web-dev-qa-db-fra.com

Comment appliquer un patch diff sur Windows?

Il existe de nombreux programmes pouvant créer un correctif diff, mais j'essaye énormément de l'appliquer. J'essaie de distribuer un correctif et un utilisateur m'a posé une question sur la façon de l'appliquer. J'ai donc essayé de comprendre par moi-même et j'ai découvert que je n'avais aucune idée, et la plupart des outils que je peux trouver sont des lignes de commande. (Je peux gérer une ligne de commande, mais beaucoup de personnes seraient perdues sans une interface graphique agréable et conviviale. Elles ne sont donc pas bonnes à cette fin.)

J'ai essayé d'utiliser TortoiseSVN. J'ai le patch que je voudrais appliquer. Je clique avec le bouton droit de la souris sur le correctif. Sous le sous-menu TortoiseSVN, une option indique "Appliquer le correctif". Tout ce qu'il fait, c'est ouvrir une fenêtre vide.

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

EDIT: Si l’on regarde les réponses jusqu’à présent, il semble que Tortoise ne le fera correctement que si le fichier est déjà versionné. Ce n'est pas le cas ici. Je dois pouvoir appliquer un correctif à un fichier qui ne provient pas d'un référentiel SVN. J'ai juste essayé d'utiliser Tortoise, car je sais que SVN utilise des diffs et doit savoir comment les créer et les appliquer.

130
Mason Wheeler

Appliquer le correctif

Avec TortoiseMerge:

  1. Rechercher et ouvrir un répertoire de référentiel SVN existant
  2. Créer un nouveau répertoire nommé "fusionne", 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 de la liste
  7. Le fichier patché avec diff est affiché dans le volet de droite
  8. Cliquez sur ce volet et appuyez sur Enregistrer ou exportez avec Fichier-> Enregistrer sous ...

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

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

31
Sheriff Md

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

Il peut aussi être téléchargé séparément dans l’archive TortoiseDiff.Zip . Cela vous permettra d’appliquer des différences unifiées à des fichiers non versionnés.

19
Paul Shannon

J'ai fait pure Python rien que pour ça. Son comportement multi-plateformes est prévisible. Même s'il ne crée pas de nouveaux fichiers (au moment de l'écriture de ceci) et manque d'une interface graphique, il peut être utilisé comme une bibliothèque pour créer un outil graphique.

[~ # ~] update [~ # ~] : Il devrait être plus pratique de l'utiliser si vous avez Python = installé.

pip install patch
python -m patch
17
anatoly techtonik

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

Vous pouvez cependant rencontrer un problème avec la terminaison de ligne. Le port GnuWin supposera que le fichier de correctif possède une terminaison de ligne de style DOS (CR/LF). Essayez d'ouvrir le fichier de correctif dans un éditeur raisonnablement intelligent et il le convertira pour vous.

15
Sardaukar

Dans TortoiseSVN, l’application de correctifs fonctionne. Vous devez appliquer le correctif au même répertoire que celui où il a été créé . Il est toujours important de garder cela à l'esprit. Alors, voici comment vous faites dans TortoiseSVN:

Faites un clic droit sur le dossier auquel vous souhaitez appliquer le correctif. 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. Cliquez sur chaque élément pour ouvrir une fenêtre de diff indiquant ce que le correctif est sur le point de faire pour ce fichier.

Bonne chance.

8
Dan

Vous pouvez utiliser this le 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. Il suffit de choisir votre petit exécutable de choix et de le stocker où vous voulez.

Utilisation simple:

patch.exe -i <patchfile>

Obtenez plus d'aide:

patch.exe --help
7
logisch

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

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

Si un message d'erreur tel que Hunk #1 FAILED at 1 (different line endings). a été obtenu lors de l'application d'un correctif, essayez d'ajouter le -l (Il s'agit d'un raccourci pour le --ignore-whitespace) Ou le --binary Passe à la ligne de commande.

4
Evgeniy Generalov

EDIT: Si l’on regarde les réponses jusqu’à présent, il semble que Tortoise ne le fera correctement que si le fichier est déjà versionné. Ce n'est pas le cas ici. Je dois pouvoir appliquer un correctif à un fichier qui ne provient pas 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 comment les créer et les appliquer.

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

2
Brian Clapper

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

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)
2
matt wilkie

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

1
Jose Ospina

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

  • Sélectionnez le menu Fichier -> Nouveau projet
  • Dans la boîte de dialogue résultante, 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 résultante, sélectionnez Sources et ajoutez un dossier source . Accédez à votre source Java).

Maintenant que vous avez un projet, appliquez le correctif:

  • Mettez votre projet en surbrillance pour le sélectionner
  • Dans le menu principal, sélectionnez le menu Outils -> Appliquer le patch Diff
  • Dans la boîte de dialogue résultante, accédez à votre fichier de correctif, sélectionnez-le et appuyez sur le bouton Patch.

C'est ça. Votre correctif doit être appliqué et une fenêtre de diff devrait apparaître, indiquant les modifications.

1
user1984699

Si vous utilisez Mercurial , cela se fait via "import". Donc, sur la ligne de commande, la commande hg import, Ou (vous pouvez trouver l’option --no-commit Utile), ou "Repository" => "Import ..." dans Hg Workbench.

Notez que ceux-ci valideront les modifications par défaut. vous pouvez éviter cela en utilisant l'option hg import --no-commit si vous utilisez la ligne de commande ou si vous avez utilisé Hg Workbench, il pourrait être utile d'émettre hg rollback après la fusion.

1
Marc Gravell

Le correctif indique à quel fichier s’appliquer. L'en-tête devrait ressembler à quelque chose comme ça (voyez-le dans le Bloc-notes ou votre éditeur de texte préféré):

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

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

GNU patch vous permettra de remplacer ces noms, mais je ne connais aucun outil graphique permettant de faire la même chose. Je vérifierais avec les différents programmes de diff - cependant, il ne semble pas que WinMerge supporte l’application de correctifs.

1
Mark Brackett

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

0
Meow

J'utilise déjà Beyond Compare (commercial) pour les diffs et les fusions, et cet outil aussi a la capacité de créer, afficher et appliquer des correctifs.

0
FourtyTwo

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.

0
Bruno

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.

0
Vinod Dalvi

Il suffit d'utiliser:

patch -p0 < path-file.patch

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

0
Ashish Lohia

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

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

0
tsellon

J'utilise MSYS2 à partir de http://www.msys2.org/

Il fournit de nombreux utilitaires comme patch, which, git, tree et bien d'autres.

Après avoir installé MSYS2, lancez simplement le gestionnaire de paquets pour installer patch:

pacman -S patch
0
isapir