2016-01-09 1 views
2

Tenir compte de ce script:Récupère la taille des lignes supprimées

mik() { 
    nov= 
    while [ $((nov+=1)) -le $1 ] 
    do 
    echo $RANDOM 
    done 
} 
mik 200 > osc.txt 
git add . 
git commit -m pap 
{ 
    head -100 osc.txt 
    mik 50 
} > que.txt 
mv que.txt osc.txt 

Ce engage un fichier de 200 lignes aléatoires, puis supprime 100 dernières lignes, puis ajoute 50 nouvelles lignes au hasard. Je voudrais obtenir la taille en octets des lignes supprimées. J'ai essayé cette commande:

$ git diff-index --numstat @ 
50  100  osc.txt 

Cependant, il montre juste le nombre de lignes ajoutés et supprimés, pas d'octets.

Répondre

0

git diff vous montrera le nombre de doublé retiré ou ajouté.
Utilisez awk, sed ou toute autre commande unix pour extraire les données de l'entrée

--shortstat est ce que vous voulez:

git diff --shortstat commit1 commit2 

git cat-file -s va afficher la taille en octets d'un objet dans git.
git diff-tree peut vous indiquer les différences entre un arbre et un autre. Rassembler ceci en un script appelé git-file-size-diff

Nous pouvons essayer quelque chose comme ce qui suit:

#!/bin/sh 

args=$(git rev-parse --sq "[email protected]") 

# the diff-tree will output line like: 
# :040000 040000 4...acd0 fd...94 M main.webapp 

# parse the parameters form the diff-tree 
eval "git diff-tree -r $args" | { 
    total=0 

    # read all the above params as described in thi sline: 
    # :040000 040000 4...acd0 fd...94 M main.webapp 
    while read A B C D M P 
    do 
    case $M in 
     # modified file 
     M) bytes=$(($(git cat-file -s $D) - $(git cat-file -s $C))) ;; 

     # Added file 
     A) bytes=$(git cat-file -s $D) ;; 

     # deleted file 
     D) bytes=-$(git cat-file -s $C) ;; 
     *) 

     # Error - no file status found 
     echo >&2 warning: unhandled mode $M in \"$A $B $C $D $M $P\" 
     continue 
     ;; 

    # close the case statment 
    esac 

    # sum the total bytes so far 
    total=$(($total + $bytes)) 

    # print out the (bytes) & the name of the file ($P) 
    printf '%d\t%s\n' $bytes "$P" 
    done 

    # print out the grand total 
    echo total $total 
} 

En utilisation cela ressemble à ce qui suit:

$ git file-size-diff HEAD~850..HEAD~845 
-234 a.txt 
112 folder/file.txt 
-4  README.md 
28  b.txt 
total -98 

En utilisant git-rev-parse il doit accepter toutes les manières habituelles de spécifier commettre des plages.

Remarque:
que bash exécute le tout lu dans un sous-shell, d'où les accolades supplémentaires pour éviter de perdre le total lors de la sortie de sous-shell.

+0

'--shortstat' affiche seulement les lignes enlevées, je veux les octets –

+0

C'est la différence de taille nette, pas la taille des lignes enlevées –

4

sed:

git diff | sed '/^i/N;s/^-//;t;d' | wc -c 

awk:

git diff | awk '/^i/{getline;next}/^-/{q+=length}END{print q}' 
  1. impression diff

  2. filtrer les lignes ---

    filtre dans les lignes supprimées

  3. Supprimer commençant -

  4. Nombre total d'octets

1
git diff @ osc.txt | git apply --no-add --cached 

appliquera uniquement les suppressions que vous avez fait à votre copie de worktree et appliquer seulement dans l'état indexé, vous pouvez alors

git cat-file -s @:osc.txt # size of committed version 
git cat-file -s :osc.txt # size of indexed version, with only worktree removals applied 
wc -c osc.txt    # size of worktree version 

vous pouvez alors

git reset @ -- osc.txt 

pour réinitialiser l'état indexé.