理系学生日記

おまえはいつまで学生気分なのか

Gitのdiffで差分の場所をメソッド/関数名で表示させる

git などで diff を表示するときに、「何行目のどのあたりに差分があるのか」というのを示す行があります。 これ、hunk header と呼ばれるものなんですが、git だとここに、「どのメソッドに属する差分なのか」「どのタグに属する差分なのか」といった情報を付与することができます。

例えば、デフォルトのまま java ファイルを diff にかけると、クラス名が表示されますが、

@@ -125,6 +125,7 @@ public final class Main {

ちょっと設定を変えると、メソッド名の粒度に変更できたりします。Github でもこんなかんじですね。

@@ -125,6 +125,7 @@ private static void startStubby4jUsingCommandLineArgs() {

実現方法としては、git の attribute の使用。 プロジェクト関係なくこれを実現したい場合、git のデフォルトの attributes 用設定ファイルである $HOME/.config/git/attributes に設定を書けばよいです。 プロジェクト固有の設定については、$GIT_DIR/info/attributes ファイルに記述することになります。

もしこの場所を変更したいときは、.gitconfigcore.attributesfile で設定ですね。

文法は普通の attribute の設定と同じなので、java なら

*.java diff=java

とするだけで、拡張子が .java のファイルに対する差分の hunk header にメソッド名が表示されるようになります。

diff --git a/main/java/io/github/azagniotov/stubby4j/Main.java b/main/java/io/github/azagniotov/stubby4j/Main.java
index ee7707c..5c6dec3 100644
--- a/main/java/io/github/azagniotov/stubby4j/Main.java
+++ b/main/java/io/github/azagniotov/stubby4j/Main.java
@@ -125,6 +125,7 @@ private static void startStubby4jUsingCommandLineArgs() {

             ANSITerminal.status(String.format(BR + "stubby4j successfully started after %s milliseconds", (totalEnd - initialStart)) + BR);

+
             stubbyManager.statuses().forEach(ANSITerminal::status);

             ANSITerminal.info(BR + "Quit: ctrl-c" + BR);
@@ -136,4 +137,4 @@ private static void startStubby4jUsingCommandLineArgs() {
             throw new Stubby4JException(msg, ex);
         }
     }
-}
\ No newline at end of file
+}

いくつかの言語用に git が最初からこの attribute を用意してくれていて、

  • C/C++: diff=cpp
  • CSS: diff=css
  • HTML: diff=html
  • Perl: diff=perl
  • PHP: diff=php
  • Python: diff=python
  • Ruby: diff=ruby

などが代表的かと思います。 ちなみに、HTML ってどうなるんだろうって思ったら、タグ名が表示される感じでした。

--- a/b.htm
+++ b/b.htm
@@ -35,7 +35,7 @@ <h1 class="header-logo">