2
1

More than 3 years have passed since last update.

Gitで特定フォルダの差分ファイルを抽出する

Last updated at Posted at 2020-12-22

gitで差分ファイルを抽出する を参考に関数化してみたんだけど、特定フォルダの差分を抽出することができず結局コマンドを入力して行ったので備忘録として書いておく。

なので、基本的には上記記事を参考にするのがよい。

差分を抽出する

git diff を使う。

git diff --diff-filter=d --name-only コミット2 コミット1

指定するコミットの順番は、コミット1からコミット2までの差分をみるという意味です。なので今の状態からあるコミット(hoge123)をみたい場合、

git diff --diff-filter=d --name-only hoge123 HEAD

と書きます。ちなみに現在の位置(HEAD)から比較する場合はコミット1の部分を省略できます。

git diff --diff-filter=d --name-only hoge123

--name-only は差分のあったファイルのパスのみを出力。--diff-filter=dは削除した差分だけ除外できるオプション。大文字と小文字で出力結果が変わってくるので注意しましょう。

参考
git diff --diff-filterが地味に優秀(削除ファイルのみ/変更ファイルのみにフィルター)

特定のフォルダの差分を抽出するには

--のあとにフォルダを指定してあげます。

git diff --diff-filter=d --name-only hoge123 -- deploy

こうするとdeploy/直下の差分が抽出できます。

差分を抽出しzip圧縮する

先程のgit diffgit archiveを組み合わせます。


git archive --format=zip --prefix=root/ HEAD `git diff --diff-filter=d --name-only hoge123 -- deploy` -o archive.zip

ちょっと注意点

あまりないことですが、パスにスペースが含まれているとエラーになるようです。

参考
Git で差分ファイルを抽出する時にパスにスペースがあるとエラーになる

Git拡張コマンド

gitで差分ファイルを抽出するの記事ではzsh/bashのコマンドとして関数化していますが、自分はgit-diffaというシェルスクリプトを作成しGitの拡張コマンドとして使っています。

#!/bin/sh

diff=""
  h="HEAD"
  if [ $# -eq 1 ]; then
    if expr "$1" : '[0-9]*$' > /dev/null ; then
      diff="HEAD~${1} HEAD"
    else
      diff="${1} HEAD"
    fi
  elif [ $# -eq 2 ]; then
    diff="${2} ${1}"
    h=$1
  fi
  if [ "$diff" != "" ]; then
    diff="git diff --diff-filter=d --name-only ${diff}"
  fi
  git archive --format=zip --prefix=root/ $h `eval $diff` -o archive.zip

↑をgit-diffaという名前で保存。パスを通します。macを使っているので、/usr/local/bin/に設置しました。

実行権限を付与するのも忘れずに。

chmod +x /usr/local/bin/git-diffa

参考
Git オリジナルのコマンドを作成する

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1