たかはらです。
Subversionを使い始めた人からよく聞かれる事があります。
「大量のファイルをsvn addするにはどうするの」
「それはねー」といつも気持ち悪い呪文を教えていたのですが、最近最適解が見つかったので記事にしてみました。
今日も小ネタ&xargsネタです。
会社では構成管理にSubversionを利用しています。Subversionを使うとsvn statusというコマンドでワークディレクトリの更新状況が判ります。
$ svn status ? d M a ! b
上記の各行最初の一文字がそのファイルの状況を表しています。この例ではファイルdはリポジトリにない(新規ファイル)、ファイルaは更新されている、ファイルbは削除されている(ワークディレクトリに削除されている)という情報が読み取れます。通常はファイルdはsvn addでリポジトリに追加し、bはsvn removeでリポジトリから削除します。
$ svn add d $ svn remove b
ファイルの数が少ない時にはこれでいいのですが、多い時は一々指定するのは大変です。普通にかんがえたら*を使うでしょう。
$ svn st ? 0 ? 1 ? 2 ? 3 ? 4 ? d ? 5 ? 6 ? 7 ? 8 ? 9 M a ! b
ところが、このような状態でsvn add *とすると以下のように警告がでてしまいます。
$ svn add * A 0 A 1 A 2 A 3 A 4 A 5 A 6 A 7 A 8 A 9 svn: 警告: 'a' は既にバージョン管理下におかれています svn: 警告: 'c' は既にバージョン管理下におかれています A d
この警告が嫌なので私は以下のようなおまじないのコマンドでまとめてsvn addをします
$ svn status|grep ^?|cut -d ' ' -f 7|xargs svn add
削除も同様にやります。
$ svn status|grep ^!|cut -d ' ' -f 7|xargs svn add
上記のコマンドのcut -d ' ' -f 7部分はsvn statusの結果からファイル名を取り出します。私はこんな呪文のようなコマンドを普段から多用しています。同様の事をやるのに人によってやり方がそれぞれで社内でアンケート取ったら3種類くらい流派がありましたがいずれもスマートではないと感じていました。
そんな折、別の構成管理のツールとしてMercurialを使って目から鱗がおちたコマンドがありました。hg addremoveです。このコマンドはまさに先程の呪文をより良い形で実現しています。これはSubversionでも導入すべきと考え以下のようなコマンドを作成しました。
#!/bin/bash svn st $* |grep "^\!"|cut -d ' ' -f 7|xargs --no-run-if-empty svn rm svn st $* |grep "^\?"|cut -d ' ' -f 7|xargs --no-run-if-empty svn add
上記svn-addremoveはリポジトリにファイルを大量にミラーする用途に大活躍します。是非利用してみてください。
Have a fun!

コメント / トラックバックはありません
コメントする