2010-01-02 11 views
14

Existe-t-il un moyen d'appliquer un seul morceau d'un diff à un fichier? Par exemple, dire que je fais un diff de fichier A et B, et qui produit trois morceaux de différences Chacun d'eux est quelque chose comme ...Comment patcher seulement un morceau particulier d'un diff

@@ -971,30 +977,28 @@ 

... (dans le cas de unifié diffs) . Je voudrais alors être en mesure de nourrir ce diff en stdin, et demander patch pour appliquer uniquement morceau N.

La méthode manuelle serait de couper et coller les mecs intéressants, mais je ne suis pas après une sorte de solution.

+0

Dans mon expérience passée, il n'est pas très difficile de lire un contexte diff dans un éditeur et de l'éliminer. Je ne vois pas vraiment l'avantage d'une structure d'argument complexe pour corriger cela. Y a-t-il quelque chose en particulier que vous essayez de faire qui rende cela intraitable? – bmargulies

+0

Disons-le de cette façon - si le correctif * l'a * soutenu * - je * l'utiliserais *. J'ai quelques macros vim qui suppriment la syntaxe de diff donc ce n'est pas trop mauvais, mais il serait plus facile de taper une seule commande. – Cyrus

Répondre

0

Certains outils de comparaison/correction de GUI permettent de sélectionner des blocs ou même des lignes individuelles. Je sais que TortoiseDiff de TortoiseSVN peut fonctionner de cette façon. Je crois que j'ai vu Windiff le faire, mais ça faisait un moment que je devais l'utiliser.

En ce qui concerne les outils de ligne de commande, je n'ai rien vu qui fasse ce que vous demandez.

+0

Je n'ai rien trouvé dans la page de manuel, mais j'ai senti que ça devait exister - et c'est juste mon incapacité à le trouver. Alors - patch lui-même n'a pas de support natif pour cela - est-ce exact? – Cyrus

7

filterdiff pourrait aider.

Il permet l'extraction de sous-ensembles de correctifs correspondant à une variété d'exigences, à partir d'un/plusieurs fichiers de correctifs. Par exemple, ici on extrait du fichier unified_diff.patch, les correctifs applicables aux fichiers avec le nom correspondant à one_file.c, uniquement aux lignes 950-1050 du fichier d'origine:

filterdiff -i *one_file.c --lines=950,1050 unified_diff.patch 

Pour extraire spécifique/gamme de Hunks:

filterdiff --hunks=1,3,5-8,15 file.patch 

patches DEGAGER messages:

filterdiff message-with-diff-in-the-body > file.patch 

etc.

+0

Nice, très pratique. – Nelson