2017-03-19 6 views
1

J'essaie d'obtenir des changements entre les validations pour un grand nombre de documents HTML, mais j'ai rapidement remarqué que la plupart des changements sont peu importants et sont généralement le résultat de la journalisation ou des scripts externes. Par exemple:Extraire des changements significatifs avec git diff

<a class="support-ga" target="_blank" href="#">0fb63cacd50e/0fb63cacd50e @ 
-app-151</a> 
+app-107</a> 
<input type='hidden' name='csrfmiddlewaretoken' 
-value='82NB5DdySoICu1mqcl0RZVk5dMCOVEQd' 
+value='a0zBgxBevaBugotGpNKI6kMPsIsBbH44' 
/> 

L'exemple précédent montre que l'examen de ces modifications n'est probablement pas très intéressant ou utile.

Je voudrais savoir s'il existe une commande git diff pour ignorer ce genre de changements. Une autre alternative est d'avoir un classement des différences basées sur la similarité. Jusqu'à présent, j'ai utilisé la commande git diff --word-diff=porcelain --unified=0 HEAD~1 HEAD, puis le traitement de cette sortie pour extraire les changements, calculer la distance de Levenshtein et supprimer les doublons. Cela aide mais ce n'est pas une bonne solution étant donné que git sait déjà quelles lignes sont supposées être comparées et fournit un nombre configurable de lignes comme contexte.

+0

pas sûr de votre cas d'utilisation est - Journaux et le code généré comme celui-ci sont généralement jamais partie du git. Tout ce qui est généré pendant la construction/l'exécution est généralement ignoré pour éviter ce problème. – TheGeorgeous

+0

Bien sûr. Évidemment, le grand nombre de documents HTML ne font pas partie d'un repo git. La plupart d'entre eux ont été téléchargés via le web grattage et les sites Web utilisent javascript massivement. En passant, j'ai vu que certains clients git offrent déjà une mesure de similarité, mais je crois que c'est seulement à des fins informatives. –

+0

L '"indice de similarité" est intégré à Git et est utilisé pour la détection de renommer: voir http://stackoverflow.com/a/21292993/1256452 (voir les commentaires en particulier: il est basé sur des lignes, moins l'espace blanc, mais cassé en fragments de 60 caractères pour les longues lignes ou les fichiers binaires). – torek

Répondre

1

Vous pouvez essayer d'écrire un pilote diff pour ignorer des motifs spécifiques.
Voir this discussion as an example.

echo '*.html filter=ignore_value' >> .gitattributes 
git config filter.ignore_value.clean "sed -e '/^value= .*$/d'" 

qui est juste un premier projet, comme l'attribut value pourrait ne pas être au début des lignes: vous devez régler le regex afin de détecter et d'ignorer toutes les lignes avec le changement que vous souhaitez sauter.

Les OP Robert Smith des points à (in the comments) une commande plus complète avec:

git diff --unified=0 HEAD~1 HEAD | grep -v -E -f PATTERNS.txt 
+0

J'ai certainement lu sur les pilotes. Malheureusement, je pense que cette approche n'est pas susceptible d'évoluer car je ne sais pas à l'avance quels modèles sont censés être ignorés. C'est la raison pour laquelle j'essayais d'utiliser une méthode mathématiquement inclinée pour filtrer les changements non pertinents, mais je vous remercie pour cette suggestion. –

+0

@RobertSmith si vous avez un nombre fini de modifications que vous voulez ignorer, cela peut évoluer. Mais ces changements (à ignorer) continuent à arriver ... alors Git n'aidera pas beaucoup. – VonC

+0

Les modifications sont, pour la plupart, répétées encore et encore à travers les documents et les validations. Cependant, comme vous pouvez le voir dans les exemples ci-dessus, il n'est pas facile de deviner quels modèles doivent être ignorés, donc l'effort est considérable pour des centaines de documents HTML. –