gracetory’s blog

東池袋にある合同会社グレストリのエンジニアブログです

たった7つのsvnと向き合うコマンド

グレストリの山口です。

突然ですが、皆さんはバージョン管理ソフトといえば何を使ってますか?

そりゃあ、エンジニアなら当然...

Subversionから逃げるな

f:id:gracetory_yama:20180611193817j:plainf:id:gracetory_yama:20180611194015j:plain

はい、ということで今回はsvnについてです。

当然、今の時代はバージョン管理と言えばgitです。

が、プロジェクトの中には安心と信頼のsvnを採用しているところもあるでしょう。

「プログラムは一応書けるけどsvn使ったことない」「gitはともかくsvnなんて化石触ったことないよ!!」みたいな人を対象に、開発で多用するsvnコマンドを厳選して7つにまとめてみました。

"history | grep svn" して出てきたのをまとめているだけな気がする...

svnコマンド7種の神器

導入/セットアップについては今更なので割愛です。

以下のコマンドを覚えればsvnはどうにかなっちゃいます。

1. svn status (svn st)

全ての基本。ディレクトリ配下で差分があるファイルを返してくれる、言わずと知れたコマンドです。

スキあらばこれを打ちまくって、現状を確認しましょう。

結果が出力されないクリーンなディレクトリを心がけたいですね。

ファイルの先頭に出てくる文字の意味は、

頭文字 意味
A 追加された
D 削除された
M 更新された
C 競合している
? 管理下にない
! 失われた

これらが主に出てくるものでしょう。

千里の道も、まずは自分の状況確認から。

-u オプション

次にupかけた時に更新されるファイルが一覧できます。

後述のsvn upにはdry-runがないので(かなり残念な部分)、この-u オプションで代用しましょう。

2. svn update (svn up)

ディレクトリ配下や対象ファイルを最新のリビジョンまで更新してくれる、言わずと知れたコマンドその2です。

開発環境では競合・デグレーションを避けるために、やっぱり常に打ちまくって最新にしましょう。

ある程度ならファイルが被ってもマージしてくれますが、何かあると怖いので誰かと同じファイルを触るのは避けましょう。

開発環境とは打って変わり、本番環境などを運用しているサーバでは細心の注意を払わないと、文字通り自分の首を締めるので注意です。

コマンドを書く時、最後に"up"の部分を書くと事故ってEnter押してしまった時のセーフティになります。

コマンド全般に言えますが、書く順番を変えるだけで事故は防げる場合がほとんどです。

3. svn commit

対象のファイルをsvnに反映させます。

たったそれだけですが、毎回このコマンドを使う時は息が詰まりそうです。

それくらいの危機感を持って、バグのないファイルをコミットできるように人類皆頑張りましょう。

ちなみに、弊社では-m コマンドで注釈を入れることは必須です。

4. svn diff

リポジトリとの差分を表示してくれます。

ツールによってはGUIで差分を出してくれるものも多いですが、CUIで作業する場合も少なくないでしょう。

誰かの更新がある度に確認、自分のコミットの前に確認。

細かな確認がプロジェクトと自分を破滅から救います。

-r オプション

-r {変更前}:{変更後} みたいにリビジョンを指定すること、その間の差分を出してくれます。

svn diff -r COMMITTED:HEAD

と書けば、コミットされているものと現在のリビジョンの差分を出してくれますし、

svn diff -r PREV:HEAD

と書けば、前回のリビジョンとの差分を出してくれます。便利。

5. svn log

黒子な子。以下のオプションを付けることで真価を発揮します。

-v オプション

ファイル名を出力してくれます。

ただそれだけ。されど重要。

-r オプション

特定のリビジョンのログを指定することができます。

上述の-v オプションと組み合わせることで、どのリビジョンでどのファイルが更新されたか一目瞭然です。

-l オプション

-l の後に見たい件数を打つことで、直近の何件かのログを見ることができます。

上述の-v オプションと組み合わせて、最近何のファイルが更新されたか確認できます。

6. svn add

新しく追加されたファイルは、svn stした際に"?"が頭文字につく状態になるわけですが、そのままcommitしても反映されません。

忘れずにsvn addでリポジトリに追加しましょう。

コミットするものが数件なら漏れてても気づきますが、多い時はうっかりaddするのを忘れて動かない...みたいなことがあり得ます(実体験)。

7. svn revert

とりあえずテストで編集したけど、コミットするつもりは全然ない...

けど、編集箇所を元に戻すのは面倒...

そんな時はrevertです。リポジトリの現在のリビジョンの状態にファイルを戻してくれます。

しかし、たくさんのファイルを編集して、一気に元に戻したいとき、このコマンドだけじゃ不便ですね。

私も面倒だなぁと感じたことは少なくなかったです。

究極的にはチェックアウトし直せばいいんですけど。

そこで、以下の応用があります。

svn status | grep ^M | awk '{print $2}' | xargs svn revert

詳しくは、こちらのサイト様をご覧ください。

» あえて言うほどではないけれども、svn コマンドあるある TECHSCORE BLOG

見てすぐ理解できなければ、ひとまずおまじないだと思ってくださって結構です。

Linuxコマンドとの組み合わせで、差分があるファイル全部revertしてくれます。

今回の記事は、この一括revertがもっと広まればいいな、と思ったのがあったから書いたようなもの。

svn status | grep ^? | awk '{print $2}' | xargs rm -rf

こう書けば、テスト用に追加した新規作成ファイル(svn addする前の状態のファイル)なんかを全部消すことも可能です。

ぜひ、awkコマンドやxargsコマンドを使いこなして、日々の作業を自動化/高速化しましょう!!

私も勉強しないと...

終わりに

この記事の中身だけだと厳しいかもしれませんが、基本はこれらのコマンドに集約されています。

この記事をキッカケに、自分で役立つコマンドの打ち方なんかを調べていけば、svnもそれなりに使えるようになるはず。

最近はgitしかやったことない人も少なくないでしょうから、もし焦ってしまったらこの記事の基本を思い返してください。

svnについて思うこと

分散型のgitと比べて集中型ならではのすぐ理解できる明解さや操作の単純さは、今でも十分メリットと言えるでしょう。

運用のやり方さえキッチリ決めておけば、今の時代でも全然ありだと個人的には思ってます。

しかしプログラマなら「svnしか使えない」なんて言った日には人権が剥奪される昨今の勢いなので、gitがメインなことは変わりないでしょう。

GitHubがマイクロソフトに買収される時代ですからね。