Comment puis-je effectuer un diff qui ignore tous les commentaires?
J'ai une grosse base de code qui a été forké le projet d'origine et je suis en train de traquer toutes les différences de l'original. Beaucoup de le fichier des modifications consistent en commentaire de débogage de code et d'autres commentaires divers. Le GUI diff/merge outil appelé Fondre sous Ubuntu peut ignorer les commentaires, mais seulement d'une seule ligne de commentaires.
Est-il un autre moyen pratique de trouver uniquement les non-commentaire de diff, soit à l'aide d'un outil graphique ou ligne de commande de linux outils? Dans le cas où il fait une différence, le code est un mélange de PHP et de Javascript, donc je suis principalement intéressé à ignorer //
/* */
et #
.
source d'informationauteur Matt V.
Vous devez vous connecter pour publier un commentaire.
Utilisation de visual diff, vous pouvez essayer de DiffMerge. Ses jeux de règles et de fournir des options de personnalisation du comportement.
À partir de la ligne de commande, vous pouvez utiliser
--ignore-matching-lines=RE
option pourdiff
par exemple:Veuillez noter que la regex doit correspondre à la ligne correspondante dans les deux fichiers et il correspond chaque ligne modifiée dans le beau gosse dans le but de travailler, sinon ça va encore montrer la différence.
Utiliser les guillemets simples pour protéger le motif de la coquille en expansion et pour échapper à la regex caractères réservés (par exemple, entre parenthèses).
Nous pouvons lire dans
diffutils
manuel:Ce comportement est aussi bien expliqué par armel ici.
Vous pouvez filtrer les fichiers par le biais de stripcmt première qui permettra d'éliminer le C et le C++ commentaires. Pour enlever
#
commentaires,sed 's/#.*//'
sera de les supprimer.Bien sûr, vous allez perdre un peu de contexte lors de la suppression de commentaires en premier, mais d'un autre côté les différences dans les commentaires ne vais pas faire de problèmes. Je pense que je l'aurais fait comme suit (pour un seul fichier, automatiser nécessaire):
A
et ladernière de la copie de la base de code est
B
, appelons les versions aveccommentaires supprimés par
A'
etB'
(par exemple, enregistrer ces temporairement les fichiers pendant le traitement).O'
(sinon il suffit de le ré-utiliserB'
pour cela).O'
A'
etB'
et d'enregistrerC'
. KDiff3 est un excellent outil pour cela.C'
est sans commentaires, donc revenir en mode "normal", faire un nouveau 3-voie de fusion avecA'
de base et deA
etC'
. Ce sera de recueillir les changements entreA'
etC'
(qui est le code change de ce que vous voulez) à la normale de la base de code avec des commentaires basés sur la versionA
.Dessin version des arbres sur papier avant de commencer à vous est fortement recommandé d'obtenir une image claire de ce qui les versions que vous souhaitez travailler. Mais ne pas être limité de ce que l'arbre est affiché, vous pouvez fusionner n'importe quelle version et dans n'importe quelle direction si vous venez de comprendre quelles sont les versions à utiliser.
Voir notre Smart Differencer ligne d'outils, qui permettent de comparer le langage de l'ordinateur source des fichiers à l'aide de la langue de la structure plutôt que la mise en page comme un guide. Ce qui implique en particulier qu'il ignore les commentaires et les espaces dans la comparaison de code.
Il y a un SmartDifferencer pour PHP.
gnu diff supports en ignorant les lignes qui correspondent à une expression régulière:
et pour les dossiers:
Ce serait ignorer toutes les lignes qui commencent par un # en début de ligne.
Loin d'être parfait, mais il vous donnera une idée des différences
Essayer:
Voir: Expression régulière à Wikipédia
Ci-dessous sont des exemples d'expressions régulières qui serait la cause d'une diff d'ignorer une directive de préprocesseur et les deux commentaire standard types de bloc.
Dans l'exemple: