2016-01-09 1 views
2

Рассмотрим этот скрипт:Получить размер удаляемых строк

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 

Это совершает файл 200 случайных линий, а затем удаляет последние 100 строк, а затем добавляет 50 новых случайных линий. Я хотел бы получить размер в байтах удаленных строк. Я попробовал эту команду:

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

Однако это только показывает число строк, добавленных и удаленных, а не байт.

ответ

0

git diff покажет вам количество снятых или добавленных футеровок.
Использование AWK, СЭД или любая другая команда Unix для извлечения данных из входного

--shortstat является то, что вы хотите:

git diff --shortstat commit1 commit2 

git cat-file -s будет выводить размер в байтах объекта в мерзавце.
git diff-tree может рассказать вам о различиях между одним деревом и другим.

Вводя это вместе в скрипт под названием git-file-size-diff.

Мы можем попробовать что-то вроде следующего:

#!/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 
} 

При использовании этого выглядит следующим образом:

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

С помощью git-rev-parse он должен принять все обычные способы задания диапазонов фиксации.

Примечание:
что Баш запускает время чтения в субоболочке, следовательно, дополнительные фигурные скобки, чтобы избежать потери всего, когда подоболочка выходит.

+0

'--shortstat' показывает только удаленные строки, мне нужны байты –

+0

То есть разница в размере чистого размера, а не размер удаленных строк –

4

СЭД:

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

AWK:

git diff | awk '/^i/{getline;next}/^-/{q+=length}END{print q}' 
  1. печати дифф

  2. Отфильтровывать --- линии

  3. фильтр в удаленных линий

  4. Удалить начало -

  5. графа общее число байтов

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

будет применяться только делеции вы сделали с вашей worktree копии, и применить только в индексированное состояние, поэтому вы можете затем

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 

вы можете

git reset @ -- osc.txt 

сбросить индексированную состояние.

Смежные вопросы