2016-01-06 3 views
4

Parfois, quand vous changez radicalement un fichier, il déclenche une ré-écriture:pourcentage d'impression de dissemblance

yes | head -256 > pa.txt 
git add . 
git commit -m qu 
truncate -s128 pa.txt 
yes n | head -64 >> pa.txt 
git commit -am ro 

Résultat:

[master 79b5658] ro 
1 file changed, 128 insertions(+), 256 deletions(-) 
rewrite pa.txt (75%) 

Toutefois, cela ne se produit pas avec les petits changements:

yes | head -128 > pa.txt 
git add . 
git commit -m qu 
truncate -s64 pa.txt 
yes n | head -32 >> pa.txt 
git commit -am ro 

Résultat:

Est-ce que je peux exécuter une commande qui montrera le changement de pourcentage indépendamment de la quantité? 0
[master 88ef937] ro 
1 file changed, 32 insertions(+), 96 deletions(-) 

J'ai regardé git diff-tree, mais encore une fois, il semble ne montrer que lorsque le changement est drastique.

+0

'git diff --numstat ' vous montrera le nombre de lignes ajoutées et supprimées, pour chaque fichier modifié entre 'commit1' et' commit2'. Cependant, le '75%' que vous voyez ci-dessus est un indice de similarité Git, qui mesure le pourcentage de lignes _changed_ dans le fichier original. C'est une métrique légèrement différente de ce que 'git diff --numstat' va vous montrer. –

+0

git diff -B1 peut-être (abaissant la threadshold par défaut 50) – VonC

+0

J'ai obtenu assez bas indice de dissimilarité avec 'git -c" core.pager = moins -SFR "diff -B1%/1%' – VonC

Répondre

0

Avec la dernière git:

> git --version 
git version 2.7.0.windows.1 

J'utilise:

git init dissimilarity 
cd dissimilarity 
yes aaa | head -128 > pa.txt 
git commit -am qu 
<remove a few lines> 
yes n | head -32 >> pa.txt 
git commit -am ro 

Puis un git diff -B1%/1% me donne:

> git diff -B1%/1% @~|grep diss 
dissimilarity index 14% 

J'ai alors faire une même mineure changer en éditant manuellement pa.txt, en supprimant quelques lignes, l'ajout d'un nouveau:

> git diff @~ 
diff --git a/pa.txt b/pa.txt 
index 7f9bf77..bf32d0b 100644 
--- a/pa.txt 
+++ b/pa.txt 
@@ -107,13 +107,7 @@ aaa 
aaa 
aaa 
aaa 
-n 
-n 
-n 
-n 
-n 
-n 
-n 
+sss 
n 
n 
n 

Et même alors, je vois encore un indice de dissemblance:

> git diff -B1%/1% @~|grep diss 
dissimilarity index 2% 

2%!

+0

Cela semble casser si la modification est inférieure à 400 octets. Par exemple 'tronquer -s400 pa.txt' 'truncate -s0 pa.txt' fonctionne, mais 399 ou moins échouera. Peut-être lié: http://github.com/git/git/blob/7548842/diffcore.h#L23 –

+0

@SarahManning Je suis d'accord. Encore: 2%! ;) – VonC

+0

Cette réponse est utile, mais pas une solution complète, car elle ne fonctionne pas dans tous les cas. Il apparaît dans ma question initiale que le problème n'était pas le pourcentage, mais la quantité d'octets changés était en dessous du seuil –

1
git diff -U10000 | awk ' 
/^i/ {getline; next} 
/^-/ {pa += length} 
/^/{qu += length} 
END {printf "%.0f%\n", pa/(pa+qu)*100} 
' 
  1. force contexte complet avec -U10000

  2. Filtre à --- lignes

  3. filtre dans des deletions et des lignes de contexte

  4. octets de comptage pour chaque

+0

Cela semble plus précis que ma réponse. +1 – VonC