変更履歴を確認する(svn log)

コミットの実行後に、リポジトリが実際にどのように更新されたことを確認するには、svn logコマンドを使用します。

まずはカレントディレクトリを作業ディレクトリへ移動します。

# cd /home/testuser/work12/

この状態で、svn logコマンドを実行します。

work12# svn log
------------------------------------------------------------------------
r3 | testuser | 2017-02-10 01:17:48 -0800 (Fri, 10 Feb 2017) | 1 line

testuserがコミット
------------------------------------------------------------------------
r2 | root | 2017-02-09 23:02:02 -0800 (Thu, 09 Feb 2017) | 1 line

別のユーザーがコミット
------------------------------------------------------------------------
r1 | root | 2017-02-09 22:15:17 -0800 (Thu, 09 Feb 2017) | 1 line

初回のコミット
------------------------------------------------------------------------

この情報から、リビジョン3(r3)に更新した(最後に変更した)ユーザーは「testuser」であることがわかります。また、これまでにチームメンバーや自身が入力したログメッセージの一覧が表示され、最近行われた変更の全般的な概要を確認できます。

–verbose(-v でも良い)オプションを指定すると、各リビジョンで行われた変更の詳細を正確に確認できます。

work12# svn log --verbose
------------------------------------------------------------------------
r3 | testuser | 2017-02-10 01:17:48 -0800 (Fri, 10 Feb 2017) | 1 line
Changed paths:
   M /trunk/index.html

testuserがコミット
------------------------------------------------------------------------
r2 | root | 2017-02-09 23:02:02 -0800 (Thu, 09 Feb 2017) | 1 line
Changed paths:
   M /trunk/index.html

別のユーザーがコミット
------------------------------------------------------------------------
r1 | root | 2017-02-09 22:15:17 -0800 (Thu, 09 Feb 2017) | 1 line
Changed paths:
   A /branches
   A /tags
   A /trunk
   A /trunk/index.html

初回のコミット
------------------------------------------------------------------------

履歴情報を確認しながらバグの発生時点を突き止めようとする場合などにとても有用なコマンドです。

リポジトリに登録されているファイル数が多く、ディレクトリ階層も深い場合、最上位ディレクトリで上記コマンドをを実行すると、かなり大量のログが出力される可能性があります。そのため、svn logコマンドの出力をパイプでmoreコマンドなどに渡して、1ページずる表示させると見やすいです。

work12# svn log --verbose | more

-rオプションを指定して、ログを表示する対象のリビジョンを限定することもできます。

# svn log -r 2
------------------------------------------------------------------------
r2 | root | 2017-02-09 23:02:02 -0800 (Thu, 09 Feb 2017) | 1 line

別のユーザーがコミット
------------------------------------------------------------------------

上記例のように単一のリビジョン番号を指定すると、そのリビジョンのログメッセージのみが表示されます。次のようにリビジョンを範囲指定して、特定の範囲のリビジョンの履歴を表示することもできます。

work12# svn log -r 2:3
------------------------------------------------------------------------
r2 | root | 2017-02-09 23:02:02 -0800 (Thu, 09 Feb 2017) | 1 line

別のユーザーがコミット
------------------------------------------------------------------------
r3 | testuser | 2017-02-10 01:17:48 -0800 (Fri, 10 Feb 2017) | 1 line

testuserがコミット
------------------------------------------------------------------------

たくさんのユーザーがリポジトリを更新していく環境下で、複数のファイルに対する変更をひとつのコミットにまとめた形で追跡管理することができるsvn logコマンドはとても便利な機能です。ぜひ、使い方を覚えておきましょう。

さらに、特定のファイルの履歴を見ていて、より詳細に調べたいと思う変更履歴が見つかった場合は、-vオプションを指定してsvn logを実行すれば良いです。

1行ごとの履歴

svn blameコマンドを使用すると、指定した1つまたは複数のファイルの内容を確認できます。

work12# svn blame index.html
     1       root <html>
     1       root <head>
     1       root <title>Subversion入門</title>
     1       root </head>
     1       root <body>
     1       root <h1>Subversion入門</h1>
     1       root <p>初回のリポジトリ登録</p>
     2       root <p>別のユーザーがコミット</p>
     3   testuser <p>testuserがコミット</p>
     1       root </body>
     1       root </html>

各ファイルの各行に、その行が最後に変更されたリビジョンと、その変更を実行したユーザーの名前も表示されます。

-rオプションで特定のリビジョンまたはリビジョン範囲を指定することで、情報を表示する対象のリビジョンを限定できます。

work12# svn blame -r 2:3 index.html
     -          - <html>
     -          - <head>
     -          - <title>Subversion入門</title>
     -          - </head>
     -          - <body>
     -          - <h1>Subversion入門</h1>
     -          - <p>初回のリポジトリ登録</p>
     2       root <p>別のユーザーがコミット</p>
     3   testuser <p>testuserがコミット</p>
     -          - </body>
     -          - </html>

svn logコマンドとsvn blameコマンドをうまく活用すれば、例えば特定のバグの修正作業において、変更が必要な箇所を突き止めようとする場合などで、これ以上に役立つツールはないと言えるでしょう。