レポジトリには以下のレビジョンがコミットされているとします。
takk@deb8:~/a/work$ ls func_00.c func_02.c func_04.c func_06.c func_08.c main.c func_01.c func_03.c func_05.c func_07.c func_09.c proto.h takk@deb8:~/a/work$ svn log | cut -b-22 | pr -4tJl1 ---------------------- r6 | takk | 2017-02-17 sample ---------------------- r5 | takk | 2017-02-17 sample ---------------------- r4 | takk | 2017-02-16 sample log ---------------------- r3 | takk | 2017-02-15 second ---------------------- r2 | takk | 2017-02-15 sample modified ---------------------- r1 | takk | 2017-02-15 first ---------------------- takk@deb8:~/a/work$
svn blameはソースコード内で各レビジョンで修正された行がわかる便利なコマンドです。
takk@deb8:~/a/work$ svn blame func_04.c | head
1 takk #include "proto.h"
1 takk void func_041(void)
1 takk {
6 takk func_043();
1 takk }
1 takk
1 takk void func_042(void)
1 takk {
6 takk /* func_043(); */
1 takk }
takk@deb8:~/a/work$
各行の左側にレビジョン番号とユーザ名が表示されています。上では、レビジョン1とレビジョン6の修正行が表示されています。
全ソースから指定レビジョンでの変更行を抽出できます。
takk@deb8:~/a/work$ svn blame *.c | grep -v ' 1 '
2 takk func_050();
6 takk func_043();
6 takk /* func_043(); */
4 takk func_044();
5 takk func_075();
3 takk func_094();
6 takk func_095();
6 takk /* func_094(); */
takk@deb8:~/a/work$
このsvn blameとcsplitを使って、 各レビジョンでどの関数が修正されたのか調べてみましょう。
まずはtmpディレクトリを作ります。
takk@deb8:~/a/work$ mkdir tmp;cd tmp takk@deb8:~/a/work/tmp$
関数の位置に印を付けてからcsplitで分割します。
takk@deb8:~/a/work/tmp$ svn blame ../*.c | perl -pe 's/^(.{17} \w.*\(.*)$/$1::/' |csplit - '/::$/' {*}
関数毎にファイルを生成したら、後はgrepするだけです。レビジョン2,3,4の修正のある関数を表示しましょう。
takk@deb8:~/a/work/tmp$ grep -l '[234] *takk' xx* | xargs head -999
==> xx32 <==
1 takk void func_032(void)::
1 takk {
2 takk func_050();
1 takk }
1 takk
==> xx43 <==
1 takk void func_043(void)::
1 takk {
1 takk func_044();
4 takk func_044();
1 takk }
1 takk
==> xx73 <==
1 takk void func_073(void)::
1 takk {
3 takk func_094();
1 takk }
1 takk
takk@deb8:~/a/work/tmp$


コメント