グレストリの山口です。
突然ですが、皆さんはバージョン管理ソフトといえば何を使ってますか?
そりゃあ、エンジニアなら当然...
Subversionから逃げるな
はい、ということで今回はsvnについてです。
当然、今の時代はバージョン管理と言えばgitです。
が、プロジェクトの中には安心と信頼のsvnを採用しているところもあるでしょう。
「プログラムは一応書けるけどsvn使ったことない」「gitはともかくsvnなんて化石触ったことないよ!!」みたいな人を対象に、開発で多用するsvnコマンドを厳選して7つにまとめてみました。
"history | grep svn" して出てきたのをまとめているだけな気がする...
- Subversionから逃げるな
- svnコマンド7種の神器
- 1. svn status (svn st)
- 2. svn update (svn up)
- 3. svn commit
- 4. svn diff
- 5. svn log
- 6. svn add
- 7. svn revert
- 2018/06/18 追記
- 8. svn delete
- 9. svn chekcout (svn co)
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
詳しくは、こちらのサイト様をご覧ください。
見てすぐ理解できなければ、ひとまずおまじないだと思ってくださって結構です。
Linuxコマンドとの組み合わせで、差分があるファイル全部revertしてくれます。
今回の記事は、この一括revertがもっと広まればいいな、と思ったのがあったから書いたようなもの。
svn status | grep ^? | awk '{print $2}' | xargs rm -rf
こう書けば、テスト用に追加した新規作成ファイル(svn addする前の状態のファイル)なんかを全部消すことも可能です。
ぜひ、awkコマンドやxargsコマンドを使いこなして、日々の作業を自動化/高速化しましょう!!
私も勉強しないと...
終わりに
この記事の中身だけだと厳しいかもしれませんが、基本はこれらのコマンドに集約されています。
この記事をキッカケに、自分で役立つコマンドの打ち方なんかを調べていけば、svnもそれなりに使えるようになるはず。
最近はgitしかやったことない人も少なくないでしょうから、もし焦ってしまったらこの記事の基本を思い返してください。
svnについて思うこと
分散型のgitと比べて集中型ならではのすぐ理解できる明解さや操作の単純さは、今でも十分メリットと言えるでしょう。
運用のやり方さえキッチリ決めておけば、今の時代でも全然ありだと個人的には思ってます。
しかしプログラマなら「svnしか使えない」なんて言った日には人権が剥奪される昨今の勢いなので、gitがメインなことは変わりないでしょう。
GitHubがマイクロソフトに買収される時代ですからね。
2018/06/18 追記
ご指摘があったので、さらに覚えておくべきコマンドを2つ追加します。
マスターして素敵なsvnライフを送りましょう!
8. svn delete
すでにコミット済みのファイルが不要になることもあると思います。
そんな時はsvn addと同じ要領で、消してあげたいファイルを指定した後にコミットする必要があります。
「削除をコミットする」というのは慣れないと変な感じがすると思いますが、削除したことをみんなに教えてあげる行為、と考えれば多少は理解しやすいかと。
普通にrmコマンドで消しただけじゃ、svnの管理からは外れてくれないので注意です。
svn deleteした後にsvn stしたら"D"が頭文字についているはずなので、それをコミットしてあげましょう。
9. svn chekcout (svn co)
作業するにはこのコマンドがないと始まりませんね。
svn co svn://{IPアドレス}/{svnを設定したディレクトリ}/ /{落としたいディレクトリ}/
基本的にはこちらのやり方で設定できます。
実際には秘密鍵/公開鍵を使ったりすると思いますので、自分の作業環境がどうなっているのかは担当者に聞くのが一番でしょう。
...というのは丸投げすぎる気がするので、以下に参考になりそうなサイト様を貼っておきます。
Subversionのリポジトリをsvn+sshで管理する - Lism.in * blog - nekoya (id:studio-m)
導入/セットアップについては割愛すると言ってしまったので、こんな感じになってしまってすみません...
checkoutは最初に設定するだけでコマンドを打つ機会は少ないですが、全ての根幹なのでしっかりやり方を覚えておきたいですね(自戒の念を込めて)。
告知
弊社からゲームアプリがリリースされました。
簡単操作で楽しめるジャンプアクションゲームなっています。
かわいいニワトリが沢山登場しますよ。
apps.apple.com