【※ 当記事は2020年6月14日時点の情報です】
ペイヴメント(@pavement1234)です。
基礎的な使い方を知りたい。
バージョン情報
Windows10 Home(64bit)1903
TourtoiseSVN 1.14.0
Subversionとは何か?
Subversionとは
プログラムのソースコードの履歴などを記録・追跡するための
クライアントサーバ型(集中型)のバージョン管理システムです。
CollabNetという会社が最初に開発しましたが、
現在は私の大好きなApacheプロジェクトでメンテナンスされています。
最近gitで開発するケースが増えているものの、
Subversionをまだまだ現場で使ってるケースが多いと聞きますが、
Subversionを使いこなせているか?
と聞かれたときに自信を持ってYESと言えない方が多いのではないでしょうか。
業務で利用してるけどcheckout、commit、updateぐらいしか使ってなくて、
conflictしたときにmergeをするのが苦手だったり
(ついつい最新版をupdateで取り直して手動マージしちゃう)
イチからリポジトリを作れと言われたら困っちゃう。
今回、TortoiseSVNをインストールして
クライアント環境にローカルリポジトリ(ファイル)を作り
基礎的なコマンドを試しますので、練習してみてください。
※svnserveやapacheでSubVersionサーバを立てて
リモートアクセスする手順は今回実施しません。
応用編で説明します。
TortoiseSVNのインストール手順
①ダウンロードサイト
ここに行きます。
≫OSDN TortoiseSVN
②「ダウンロードファイル一覧」をクリック
③「1.14.0」をクリック
※せっかくなので2020年6月10日現在の
最新版を取得してみた
④インストーラとランゲージパックをダウンロード
「1.14.0」の下はこういう構成になってます。
「Application」にインストーラがあり
「Language Packs」にランゲージパックがあります。
まず「Application」の下にあるインストーラ(赤枠)をクリックします。
※私の環境はWindows10の64bitです。
「ファイルを保存」をクリック。
次に 「Language Packs」の下にあるランゲージパックをクリックします。
※私は日本語を選択しました。
32bitと64bitがあるので注意してください。
「ファイルを保存」をクリック。
⑤インストーラをインストール
インストーラをダブルクリック。
「Next」をクリック。
「Next」をクリック。
「Next」をクリック。
「Install」をクリック。
インストール中。
「Finish」をクリック。
⑥ランゲージパックをインストール
ランゲージパックをダブルクリック。
「次へ」をクリック。
すぐにインストールが終わります。
「Configure TortoiseSVN to use this language」をONにして
「完了」をクリック。
これでインストールは完了です。
インストールが成功したことを確認するには、
Cドライブなどを右クリックしてコンテキストメニューを表示し、
SVNのメニュー(赤枠)が追加されていればOK。
※日本語化も成功しています。
ローカルリポジトリを作る
リポジトリーはデータを蓄積する箱みたいなものです。
今回「C:\SVN\document」というフォルダをSVNのリポジトリにします。
①「C:\SVN\document」というフォルダを作る
②「document」フォルダを右クリックし
「TortoiseSVN」→「ここにリポジトリを作成」をクリック
③リポジトリ作成
こんなダイアログが出てくるので「フォルダー構造を作成」をクリック。
クリックするとtrunk/branches/tagsというフォルダがDB内に作成されます。
※まだ「OK」は押さないように…。
trunk:リリース版を入れる場所
branches:trunkから派生させて実験などを行う場所
デバッグ中はここに置いておくべし
tags:リリース版のスナップショットを保持
「デフォルトのディレクトリ構造の作成に成功しました」
というメッセージを「OK」で閉じます。
「OK」をクリック。
これでリポジトリが作成されました。
「document」フォルダのアイコン表示が変わりました。
「document」フォルダの下はこういう配置になってます。
先ほど作ったtrunk/branches/tagsというフォルダが
どこにも見当たらないのですがご心配なく。
謎は次の項で解けます。
チェックアウト
先程作った「C:\SVN\document」はデータベース本体でして、
ここに直接ファイルを入れることができません。
まずやるべきことはチェックアウト(取得)です。
①「C:\work\document」というフォルダを作る
②SVNチェックアウト
「C:\work\document」というフォルダを右クリックして
「SVNチェックアウト」をクリック。
リポジトリのURLが空なので、
先ほど作成した「C:\SVN\document」を選択します。
選択するとこうなります。
「file:///」というURL形式になっていることにご注意ください。
ローカルファイルだけでなくインターネット上に置いてある
「https://」で指定されるリポジトリが対象になることもあるので、
URL形式になってるんですね。
【豆知識】
なぜ「file:///」とスラッシュ3つになっているのでしょうか?
RFC1738(URL仕様)の3.10に
「As a special case, <host> can be the string “localhost” or the empty string; this is interpreted as `the machine from which the URL is being interpreted’.」
とあります。
ローカルファイルにアクセスするときの特例で
「file://<host>/<path>」の<host>を省略することが可能なのです。
よって「file:///<path>」とスラッシュ3つになります。
「OK」をクリックします。
「C:\work\document」の下を見ると、
trunk/branches/tagsが生成されました。
チェックアウトすることで初めて実態が見えるんですね。
ちなみにtrunk/branches/tagsはすべて空っぽです。
次の項でファイルを足していきます。
ファイルを追加してコミットする
①trunkの下に「TEST.txt」というファイルを作成する
「C:\work\document\trunk\TEST.txt」というファイルを作成します。
※今回はカンタンな実験のためtrunkを直接編集していますが、
チーム開発において複数人でtrunkを弄るのは怖いので、
branchesで開発して安定したものをリリース版として
trunkにコミットすることを私は推奨します。
なんでも良いので
「C:\work\document\trunk\TEST.txt」
に文字を書きこんでおきます。
②ファイルをSVNに追加してコミットする
「C:\work\document\trunk\TEST.txt」を右クリックして
「TortoiseSVN」→「追加」をクリックします。
これで「TEXT.txt」がSVNの管理下に入ります。
「C:\work\document\trunk\TEST.txt」を右クリックして
「SVNコミット」をクリックします。
コミット画面が出るのでメッセージに「新規作成」と書いて「OK」をクリックします。
このとき変更内容を必ずメッセージに残すようにすることをお勧めします。
当然コミットした瞬間は何を書いたか覚えていますが、
おそらく翌日には忘れていると思うので…。
コミットが終了し
「C:\work\document\trunk\TEST.txt」はリビジョン2になりました。
コミットする度にリビジョンが上がっていきます。
「OK」をクリックして閉じます。
「C:\work\document\trunk\TEST.txt」を右クリックして
「TortoiseSVN」→「リポジトリーブラウザー」をクリックします。
「TEST.txt」がtrunkに登録されていることが確認できました。
ファイルを修正してコミットする
①「C:\work\document\trunk\TEST.txt」を開き
コメントを追加して保存
何でも良いのでコメントを追加して保存します。
②コミット
「C:\work\document\trunk\TEST.txt」を右クリックして
「SVNコミット」をクリックします。
メッセージにコメントを記入して「OK」をクリックします。
コミットが終了し
「C:\work\document\trunk\TEST.txt」はリビジョン3になりました。
「OK」をクリックして閉じます。
「C:\work\document\trunk\TEST.txt」を右クリックして
「TortoiseSVN」→「リポジトリーブラウザー」をクリックします。
「C:\work\document\trunk\TEST.txt」を右クリックして
「リビジョングラフ」をクリックします。
リビジョングラフが表示されました。
「×」ボタンで閉じます。
「TEST.txt」を右クリックして「ログを表示」をクリックします。
リビジョン2と3の両方が選択された状態で右クリックして
「リビジョンを比較」をクリックします。
リビジョン2と3の差分(diff)が表示されます。
ミスを防ぐため私はコミットの度に差分を確認するようにしています。
サーバ上の最新データでローカルファイルを更新する
今回、操作しているのが私だけなので
サーバとローカルのファイルが常に一致していますが、
普通は複数人で開発を進めるのでサーバのファイルがどんどんUPDATEされます。
①更新
「C:\work\document\trunk\TEST.txt」を右クリックして
「SVN更新」をクリックします。
更新が行われ最新リビジョンになります。
「OK」をクリックして閉じます。
※今回はすでに最新ファイルなのですが、
複数人で開発すると気づかぬうちにリビジョンがどんどん上がるため、
1日の最初に「SVN更新」をする癖を付けましょう。
競合(conflict)と競合の解消(merge)
例えばこんな状況です。
AさんとBさんはrev1をcheckoutしました。
Aさんが先にcheckinしてrev2に上がりました。
Bさんはrev1のまま更新を続けてupdateせずに
(最新ファイルに更新せずに)checkinを試みました。
このときBさんのファイルはrev1がベースになっているので
rev2と競合(conflict)してしまいcheckinに失敗します。
こういう場合競合の解消(merge)が必要になります。
競合の解消(merge)をどう進めるか
具体的な手順を示します。
①古いリビジョンに戻して競合(conflict)を発生させる
「C:\work\document\trunk\TEST.txt」を右クリックして
「TortoiseSVN」→「特定リビジョンへ更新」をクリックします。
リビジョンを2に指定して「OK」をクリックします。
最新リビジョンは3なのでリビジョンが1つ戻ります。
「OK」で閉じます。
リビジョンが2のファイルを開き、もともと書いてあった「TEST」に加えて
「1234」という文字列を追加して保存しました。
古いリビジョン2をベースに追加しているため競合(conflict)が発生しています。
②競合(conflict)が起きている状態で
コミットを試みる(失敗する)
「C:\work\document\trunk\TEST.txt」を右クリックして
「SVNコミット」をクリックします。
メッセージに「rev2に追記」と記入して「OK」をクリックします。
まず作業コピーを更新してくださいというエラーが発生しコミット失敗。
競合(conflict)が起きている状態ではコミットが出来ないんですね。
「OK」を押して閉じようとすると「更新しますか?」みたいに聞かれるので
「キャンセル」してコミットから抜けます。
③競合(conflict)が起きている状態で更新する
「C:\work\document\trunk\TEST.txt」を右クリックして
「SVN更新」をクリックします。
更新時に競合が検出されました。
「OK」をクリックして閉じます。
リビジョン2「C:\work\document\trunk\TEST.txt.r2」、
リビジョン3「C:\work\document\trunk\TEST.txt.r3」、
競合ファイル「C:\work\document\trunk\TEST.txt.mine」
の3つのファイルが出来ました。
「C:\work\document\trunk\TEST.txt」はこのようになりますので、
手動で競合を解消しなければなりません。
AさんとBさんで話し合った結果、こういう結論に至りました。
というわけでコミットしたいのですが、
その前に競合(conflict)を解決しなければなりません。
④競合(conflict)の解決
「C:\work\document\trunk\TEST.txt」を右クリックして
「TortoiseSVN」→「解決する」をクリック。
「OK」をクリック。
競合の解決が終了しました。
「OK」を押して閉じます。
競合の解決とともに、
リビジョン2「C:\work\document\trunk\TEST.txt.r2」、
リビジョン3「「C:\work\document\trunk\TEST.txt.r3」、
競合ファイル「C:\work\document\trunk\TEST.txt.mine」の
3つの一時ファイルが消えて
「C:\work\document\trunk\TEST.txt」が残りました
ここまで来ればコミットできます。
⑤コミット
「C:\work\document\trunk\TEST.txt」を右クリックして
「SVNコミット」をクリック。
メッセージに「AさんとBさんの競合をマージ」と記入して
「OK」をクリックします。
無事コミットが完了してリビジョン4になりました。
trunkからbranchesを作成
デバッグ用にtrunkからbranchesを作成する手順をご紹介します。
「C:\work\document\trunk\TEST.txt」を右クリックして
「TortoiseSVN」→「ブランチ/タグの作成」をクリックします。
コピー元と宛先が同じなので、
「宛先パス」の右側にあるファイルダイアログ を開きます。
「branches」を選択して「OK」をクリックします。
「宛先パス」が「/branches」になるので
「/branckes/TEST.txt」という感じに「/TEST.txt」を追記します。
ログメッセージに「trunk/TEST.txtのrev4からブランチを作成する。」
というコメントを記載して「OK」をクリックします。
ブランチが作成されリビジョン5になりました。
「C:\work\document\branches」を右クリックして
「SVN更新」をクリックします。
すると先ほど作成したブランチがローカルに更新(コピー)されました。
「C:\work\document\branches\TEST.txt」を右クリックして
「TortoiseSVN」→「リポジトリブラウザー」をクリックします。
branchesにリビジョン5のTEST.txtが作成されていることが確認できました。
リリース用にtrunkからtagsを作成する手順は
trunkからbranchesを作成する手順とほぼ同じです。
branchesをtagsに読み替えればOKですので詳細は割愛します。
branchesからtrunkにマージ
①branchesのファイルを更新する
branchesの作業フォルダの
「C:\work\document\branches\TEST.txt」を開きます。
リビジョン5のファイルの末尾に
「5678」という文字列を追記して保存します。
「C:\work\document\branches\TEST.txt」を右クリックして
「SVNコミット」をクリックします。
「メッセージ」に「追記した」というコメントを記入し「OK」をクリック
リビジョン7でコミットされました(キャプチャー忘れ)。
※リビジョン6はtagsで消費されました。
②branchesをtrunkにマージ
作業フォルダを「C:\work\document\trunk\TEST.txt」に切り替えます。
この手順が必要な理由は
マージ元:リポジトリ、マージ先:作業フォルダである必要があるためです。
作業コピーの宛先パスを「trunk\TEST.txt」にして
「OK」をクリックします。
「OK」をクリックして閉じます。
trunkの作業コピーの
「C:\work\document\trunk\TEST.txt」を右クリックして
「TortoiseSVN」→「マージ」をクリックします。
「リビジョンの範囲をマージ」を選択して「次へ」をクリック。
マージ元のURLが(作業フォルダではない)ブランチのリポジトリ
「file:///C:/SVN/document/branches/TEST.txt」を指し、
一番下の作業コピーがtrunkの作業フォルダ
「C:\work\document\trunk」を指している状態で
「次へ」をクリックします。
「マージ」をクリックします。
branchesのリポジトリにあるリビジョン7のTEST.txtが
trunkの作業フォルダにある「C:\work\document\trunk\TEST.txt」
にマージされました。
「OK」をクリックして閉じます。
但しこのタイミングではまだtrunkの作業フォルダが変更されただけなので
コミットする必要があります。
trunkの作業フォルダの
「C:\work\document\trunk\TEST.txt」を右クリックして
「SVNコミット」をクリックします。
メッセージに「branckのリビジョン7をtrunkにマージ」と入力し
「OK」をクリックします。
コミットが完了しリビジョン8になりました。
リポジトリブラウザを開きtrunkのログを表示すると、
リビジョン4の次がリビジョン8になっていて、
マージが成功していることが確認できました。
高度なマージはさておき、
マージの基本は
マージ元:リポジトリ、マージ先:作業フォルダ、マージが終わったらコミットが必要
ということを覚えておいてください。
まとめ
TortoiseSVNのインストールと基礎的な使い方をご紹介しました。
個人で開発をしている方がファイルを管理するだけなら
上記の手順を覚えておけばそんなに困らないと思います。
より詳しく知りたい方は書籍を参考にしてください。