どこでも見れるメモ帳

ソフトウェアに関する備忘録を投稿します.何かあれば気軽にコメントください♪

SVN/GITリビジョン区間の更新ファイルをパッチ化する

はじめに

f:id:ni66ling:20160611151644p:plain

SVNもしくはGITにおけるリビジョン区間*1の更新ファイルをパッチ化*2する作業が生じたためシェル化メモ。

やりかた(SVNの場合)

# リビジョン区間(r6000-r6100)における更新ファイルについて、
# ディレクトリ構造を維持したままtar.gzに固める
svn diff -r6000:6100 --summarize \
  | awk '{print $2}' \
  | (mkdir patch_dir; \
     xargs -I{} cp --parents {} patch_dir; \
     tar czvf patch.tar.gz patch_dir; \
     rm -Rf patch_dir)

補足すると,以下の様な流れ

  • 1行目で、リビジョン区間(r6000からr6100)の更新ファイル一覧を取得
  • 2行目で、更新ファイル名のみを抽出
  • 3行目で、作業パッチディレクトリを作成
  • 4行目で、更新ファイルそれぞれについて、ディレクトリ構造を維持たままパッチディレクトリにコピー
  • 5行目で、パッチディレクトリをtar.gzに固める
  • 6行目で、作業パッチディレクトリを削除

やりかた(Gitの場合)

# gitでリビジョン区間(リビジョンハッシュA-リビジョンハッシュB)における更新ファイルについて、
# ディレクトリ構造を維持したままtar.gzに固める
git diff --name-only リビジョンハッシュA..リビジョンハッシュB \
  | (mkdir patch_dir; \
     xargs -I{} cp --parents {} patch_dir; \
     tar czvf patch.tar.gz patch_dir; \
     rm -Rf patch_dir)

補足:SVNでリビジョン区間の更新ファイル一覧を最終更新リビジョンとともに取得

# リビジョン区間(r6000-r6100)の更新ファイル一覧を最終更新リビジョンとともに取得
svn diff -r6000:6100 --summarize \
  | awk '{print $2}' \
  | xargs -I{} bash -c "( svn ls -v -R {} | awk '{printf \$1}'; echo ' '{} )"

*1:SVNなら例えばr6000からr6100、GITなら例えばリビジョンハッシュXからリビジョンハッシュY

*2:ディレクトリ構造を維持したままtar.gzに固める