maya's blog

About programming, aws and ubuntu

Show different file between master branch and feature branch

TL;DR

git diff --name-only --diff-filter=ACMRTUXB origin/develop feature/branch

これは何?

CIでfeatureブランチでの差分のみに対してLintをかけたいという状況があった。 PHP-CS-FixerのREADMEにちょうどよい使い方があった。

github.com

以下gitコマンドのオプション・引数説明。

--name-only option

--name-only
    Show only names of changed files.

ファイル名だけ表示する

--diff-filter option

--diff-filter=[(A|C|D|M|R|T|U|X|B)...[*]]
    Select only files that are
    Added (A), Copied (C), Deleted (D), Modified (M), Renamed (R),
    have their type (i.e. regular file, symlink, submodule, ...) changed (T), 
    are Unmerged (U), are Unknown (X), or have had their pairing Broken (B).
    Any combination of the filter characters (including none) can
    be used. When * (All-or-none) is added to the combination,
    all paths are selected if there is any file 
    that matches other criteria in the comparison;
    if there is no file that matches other criteria, nothing is selected.

    Also, these upper-case letters can be downcased to exclude.
    E.g.  --diff-filter=ad excludes added and deleted paths.

    Note that not all diffs can feature all types.
    For instance, diffs from the index to the working tree can never have Added entries
    (because the set of paths included in the diff is limited by what is in the index).
    Similarly, copied and renamed entries cannot appear if detection for those types is disabled.

一瞬ACMR...と何を意味しているのかと思うけれど、manual読めば理解。 追加やコピー、削除、修正等々されたファイルのみを表示するようにするというオプション。 削除されたファイルはそもそもファイルの実態がなくLint対象外なので、このオプションをつけておいたほうがよさげ。

origin/master feature/branch で差分対象ブランチ指定

ローカルリポジトリではmasterブランチは大抵の場合あるけれど、CI環境ではfeature/branchブランチのみをcloneするようにしている場合が多い。 ここをmasterにしてCI環境下でこのコマンドを叩くとまぁ当たり前のようにmasterブランチなんてねーぞと怒られる。 prefixにorigin/をつけてリモートリポジトリのブランチ情報と比較するようにする。