2016年6月30日木曜日

SVNと巨大なパッチ

オープンソースソフトウェア等をとってきて
それをSVNサーバに登録してバージョン管理していたとして、
本家から出てきたパッチを当てることはよくある事でしょう。
ところがそのパッチによって大量の新規ファイルが追加されたり、
大量の既存ファイルが削除されたりすると、
SVNサーバへのコミット作業が大変な事になることがあります。
追加なら
$ svn add ./ --force
のようにして強引に一括処理することもできますが、
削除の方は非常に面倒です。

これ、以前からいい方法がないかなと考えていたのですが、
$ svn status
で、先頭が'?'の行が新規追加ファイル、
先頭が'!'の行が削除するファイルであることに気付いたことから、
これを利用すれば難しくないとこがわかりました。

すなわちファイルを追加するなら
$ svn status | grep '^?' | sort | sed -e 's/^?\(.*\)$/svn add \1/' > /tmp/add.txt
として、"/tmp/add.txt"の内容を数行ずつ実行していけばいいのです。
一機に実行、あるいは"> /tmp/add.txt"の代わりに"| sh"とすることで
直接実行してもいいですが、何かエラーが出たときに
手動で対処する必要がなくはないので、慎重にことを運んだ方がいい気がします。
なお、"svn status"では未登録のディレクトリについては
そのディレクトリだけが抽出され、その配下のファイルは出てきませんが、
ディレクトリを"svn add"すればその配下のファイルも追加されるので、
通常は一発で作業が完了します。

削除についても同様で、
$ svn status | grep '^!' | sort -r | sed -e 's/^!\(.*\)$/svn del \1/' > /tmp/del.txt
から始めればいいでしょう。

簡単にいかないのはパッチによって削除されたファイルを、
サイズ0の空ファイルとして登録しておきたいような場合です。
先ほどと同様"svn status | grep '^!' | sort -r"の結果について、
ディレクトリなら"mkdir -p"を実行することになりますし、
ファイルなら"touch"で作ることになるのですが、
"svn status"の結果ではそれがディレクトリなのかファイルなのか判別できませんし、
ファイルを作成する前にその上位ディレクトリを作成しなければならないこともありえ、
もう少し面倒な作業が必要になります。
まあこんなのはレアケースだと思いますが。

0 件のコメント:

コメントを投稿