プロジェクト比較の2つの方法⑤(Gitのコミットをコマンドラインから比較する)

Understand

はじめに

いつも弊社Understandブログをご購読いただきありがとうございます。

前回の記事では「まとめ」を記載しましたが、追加でご質問をいただいたため、本記事は前回までのシリーズの続きとして公開します。シリーズ第1回の記事はこちらをご確認ください。

前回までは構成管理ツールとの連携方法を利用した2つの方法を中心に説明いたしました。

なお、弊社ではコマンドラインからプロジェクトの比較ができないか、というご相談をいただくことがあります。
背景には、CI環境での利用やMCPの活用などがあるのではないかと想像しています。
本記事ではコマンドライン実行で差分を取得する方法をご案内したいと思います。

本シリーズ目次

第1回:Understandでプロジェクト比較をおこなうメリット

第2回:Gitリポジトリを使用した比較(Git専用)

第3回:2つのソースコードを使用した比較(Git以外でも利用可)

第4回:まとめ

第5回:Gitのコミットをコマンドラインから比較する

作業手順

準備

本記事の執筆にあたっては、Windows環境のGit Bashを使用して作業をおこなっています。
そのため、Linux環境で作業される方もほぼ同じコマンドをそのままご利用いただけると考えています。

なお、Gitリポジトリの配置は、本シリーズにおける②の記事と同じものとなります。

  • gitリポジトリの準備
$ git clone https://git.zx2c4.com/cgit .

  • 作業ディレクトリにあるファイルの確認

今回は.gitのあるディレクトリで作業をします。
これは次の[実行環境の準備]において、.undを作成する際に自動的に.gitを見つけるためです。

また、プロジェクトの比較をする場合、.undから見たソースコードの構成が一致した2つのプロジェクトを用意する必要があるため、.gitがあるディレクトリで作業をおこなうと都合が良いです。

$ ls -al
total 511
drwxr-xr-x 1 user1 1049089     0 Apr 24 11:19 ./
drwxr-xr-x 1 user1 1049089     0 Apr 24 11:19 ../
drwxr-xr-x 1 user1 1049089     0 Apr 24 11:19 .git/
-rw-r--r-- 1 user1 1049089   166 Apr 24 11:19 .gitignore
-rw-r--r-- 1 user1 1049089    83 Apr 24 11:19 .gitmodules
-rw-r--r-- 1 user1 1049089   588 Apr 24 11:19 .mailmap
-rw-r--r-- 1 user1 1049089   353 Apr 24 11:19 AUTHORS
-rw-r--r-- 1 user1 1049089 18431 Apr 24 11:19 COPYING
-rw-r--r-- 1 user1 1049089  5088 Apr 24 11:19 Makefile
-rw-r--r-- 1 user1 1049089  3103 Apr 24 11:19 README
-rw-r--r-- 1 user1 1049089 11586 Apr 24 11:19 cache.c
-rw-r--r-- 1 user1 1049089  1019 Apr 24 11:19 cache.h
-rw-r--r-- 1 user1 1049089 36994 Apr 24 11:19 cgit.c

(以下省略)

  • 実行環境の準備

環境変数を設定します。プロジェクト名には、gitのコミットハッシュ値を含めることで利便性が高まります。

$ und version
(Build 1220)

$ export project_name=cgit
$ export new_commit_id=5e49023
$ export old_commit_id=c4d23d0
$ export new_und_project=${project_name}_${new_commit_id}.und
$ export old_und_project=${project_name}_${old_commit_id}.und
$ export diff_report=${project_name}_changes_${new_commit_id}_${old_commit_id}.csv

$ echo $new_commit_id
5e49023

$ echo $old_commit_id
c4d23d0

$ echo ${new_und_project}
cgit_5e49023.und

$ echo ${old_und_project}
cgit_c4d23d0.und

比較元プロジェクト(通常はNew Version)を作成する

$ und create -gitrepo . -gitcommit ${new_commit_id} -languages c++ -local -db ${new_und_project}
$ und add . ${new_und_project}
Files added: 51
$ und settings -C++UseStrict off -db ${new_und_project}
$ und settings -FileEncoding "UTF-8" -db ${new_und_project}
$ und analyze -db ${new_und_project}

比較先プロジェクト(通常はOld Version)を作成する

$ und create -gitcommit ${old_commit_id} -refdb ${new_und_project} ${old_und_project}
$ und analyze -db ${old_und_project}

補足

und createコマンドのオプション説明
-refdb <参照先プロジェクト名>プロジェクトを新規で作成する際、このオプションで指定したプロジェクト(参照先プロジェクト)の設定を使用します。
同時に、参照先プロジェクト(上記例ではnewproject.und)の比較対象プロジェクトに今回作るプロジェクト(oldproject.und)が設定されます。


差分レポートを出力する

newproject.undには比較対象のプロジェクトとして既にoldproject.undが追加されているため、以下のコマンドを実行することで差分レポートを出力することが可能です。

$ und export -changes ${diff_report} ${new_und_project}

出力された差分レポートには、本シリーズ①の記事で触れた差分エンティティロケーターの内容が出力されています。
エンティティの種類がFunctionやMethodであるものを見ることで、比較したコミット間で変更された関数が把握できます。

おわりに

今回はコマンドラインからプロジェクトの比較設定をおこない、差分レポートを出力する方法を解説いたしました。

なお、今回比較先を設定したプロジェクト(${new_und_project})を利用することで、Compare系のグラフやGit系のインタラクティブレポートの出力も可能となっています。
CIやMCP等でご利用を検討中の方は、ぜひお試しください!