4

次のコードを実行しています

git log --pretty=format: --numstat -- SOMEFILENAME |
   perl -ane '$i += ($F[0]-$F[1]); END{print "changed: $i\n"}' \
      >> random.txt

これが行うことは、「SOMEFILENAME」という名前のファイルを取得し、追加および削除された行の合計量を「random.txt」というテキストファイルに保存することです

リポジトリ内のすべてのファイルでこのプログラムを実行する必要があり、それらの略奪品があります。これを行う簡単な方法は何ですか?

4

2 に答える 2

2

ファイルごとの合計が必要な場合:

git log --pretty=format: --numstat |
   perl -ane'
      $c{$F[2]} += $F[0]-$F[1] if $F[2];
      END { print "$_\t$c{$_}\n" for sort keys %c }
   ' >random.txt

単一の合計が必要な場合:

git log --pretty=format: --numstat |
   perl -ane'
      $c += $F[0]-$F[1];
      END { print "$c\n" }
   ' >random.txt

それぞれの出力は次のとおりです。

.gitignore      22
Build.PL        48
CHANGES.txt     0
Changes 25
LICENSE 132
LICENSE.txt     0
MANIFEST        18
MANIFEST.SKIP   9
README.txt      67
TODO.txt        1
lib/feature/qw_comments.pm      129
lib/feature/qw_comments.xs      250
t/00_load.t     13
t/01_basic.t    85
t/02_pragma.t   56
t/03_line_numbers.t     37
t/04_errors.t   177
t/05-unicode.t  39
t/devel-pod-coverage.t  26
t/pod.t 17

1151
于 2013-03-20T18:30:07.530 に答える
0

を使用するのではなく、名前(現在のディレクトリを表す)を使用してすべてのファイルを提供することfindができます。これで、ファイルごとの統計を出力するバージョンを使用します。git.awk

git log --pretty=format: --numstat -- . |
awk '
    NF == 3 {changed[$3] += $1 - $2}
    END { for (name in changed) { printf("%s: %d changed\n", name, changed[name]); } }
'

そして、1つの全体的に変更された行を印刷するさらに短いもの:

git log --pretty=format: --numstat -- . |
awk '
    NF == 3 {changed += $1 - $2}
    END { printf("%d changed\n", changed); }
'

(これは、出力に偽の空白行が出力されているように見えるNF == 3という事実を説明するためのものです。より良いコマンドがあるかどうかを判断しようとはしませんでした。)gitgit

于 2013-03-20T18:44:41.567 に答える