2020-04-20

git で --diff-filter に D 以外指定して削除されたファイルを除外する

納品用の差分データをまとめていて、なんかエラーでうまくできないなぁということがあり。

gitで差分ファイルを抽出してzipにまとめる方法 - HAM MEDIA MEMO
https://h2ham.net/git-diff-fil...

(そもそも差分データまとめるとかではなくGitからデータを取ってもらえるといいのだけど)

とりあえず、出てるエラーはこんな感じで

fatal: pathspec 'hogehoge/fugafuga.gif' did not match any files

そのファイルはみつからないってことで

$ git archive --format=zip --prefix=archive/ HEAD `git diff --name-only --diff-filter=d [commit] HEAD` -o archive.zip

みたいに --diff-filter=d で削除(D)したファイルが除外されるものと思っていたのだけど、これでもエラーになる。

なので、D 以外を指定する方法

$ git archive --format=zip --prefix=archive/ HEAD `git diff --name-only --diff-filter=ACMRTUXB [commit] HEAD` -o archive.zip

でとりあえずとれたっぽい。

git あるコミットからHEADまでの差分を、削除ファイルを除外してアーカイブする - Toconangoのブログ
http://toconango.hatenablog.co...

--diff-filter 的には

--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.

ってことなんだけどなー。なんか勘違いしてそうな気はする。