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 diff
とgit 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