Subversion初心者のメモ

# Subversion基本学習用チュートリアルをやってみた

下記のチュートリアルをやってた際の学習用メモです。
環境はWindows7(32bit)。

__Subversion の基礎勉強 ～Subversion によるバージョン管理を使う～__
http://tracpath.com/bootcamp/learning_subversion.html

*※記事中、部分的にコミット実行などの手順が抜け落ちたりしているようなので注意した方がいいです。
手順通りにやったつもりですが、どこで間違ったのか、記事と実際のcmd実行結果の表示に差異があって困惑しました。ですので、以下の内容はあまり参考にならないと思いますのでご了承ください。*



## レッスン 1. インストール
http://tracpath.com/bootcamp/learning_subversion.html

__ Apache Subversion ダウンロードページ__
http://subversion.apache.org/packages.html

ページ下部のWindows項リストの[Win32Svn]からダウンロード
今回ダウンロードファイル：Setup-Subversion-1.8.16.msi

インストーラーをダブルクリック、ウィザードが開く。

1. Welcome to the Subversion Setup Wizerd [Next]
1. Information [Next]
1. Select Apache Version バージョンを2.2.x/2.4.xかを選択して[Next]※バージョン確認方法は後に記述
1. Destination Folder デフォルトのProgram Filesまま[Next]
1. Ready to install Subversion [Install]
1. Completed the Subversion Setup Wizard [Finish]で完了


私の環境にはxampp導入済でApacheがインストールされていましたがバージョンが分からなかったので確認。
参考：http://kakakakakku.hatenablog.com/entry/20081019/1224344123

```ruby:cmd
>cd C:\xampp\apache\bin\
>httpd -v
```

*※各コマンド入力実行する際のコードについて、一部のコードは上記のようにカレントディレクトリ表記を省略してます。その場合は行頭に「>」記号を付けています。*

※ディレクトリは各々の環境に合せてください。
バージョン情報を表示させると

```ruby:cmd
Server version: Apache/2.4.12 (Win32)
Apahe Lounge …以下略
```

確認できました。

インストールが完了したら次へ。
*インストール後、再起動しないと環境変数のpathが有効にならないので注意*


## レッスン 2. 動作確認
http://tracpath.com/bootcamp/learning_subversion.html#id4

動作の確認をしてみる。
Subversion は CUI ツールのためコマンドラインから利用する。

```ruby:cmd
>cd C:\Program Files\Subversion\bin\
>svn
```


Subversion インストール階層に移動し、svn と打ってみると…
*※インストール後、再起動してpathが通っていれば C:\ 階層から svn で大丈夫*

```ruby:cmd
使用法を知りたいときは 'svn help' と打ってください。
```

こう表示されたので入力してみる。

```ruby:cmd
>svn help
```

結果

```ruby:cmd
使用方法: svn <サブコマンド> [<オプション>] [<引数>]
Subversion コマンドラインクライアント, バージョン 1.8.16.
特定のサブコマンドに関するヘルプを読みたいときは 'svn help <サブコマンド>' と
打ってください。
プログラムのバージョンや RA モジュールを参照するには 'svn --version' と、
バージョン番号のみを参照するには 'svn --version --quiet' と、打ってください。

ほとんどのサブコマンドはファイルとディレクトリの一方または両方を引数にとり、
ディレクトリでは再帰的な処理をします。このようなコマンドに引数が与えられなかった場合、
デフォルトでは、カレントディレクトリで再帰的な処理をします。

利用可能なサブコマンド:
   add
   blame (praise, annotate, ann)
   cat
   changelist (cl)
   checkout (co)
   cleanup
   commit (ci)
   copy (cp)
   delete (del, remove, rm)
   diff (di)
   export
   help (?, h)
   import
   info
   list (ls)
   lock
   log
   merge
   mergeinfo
   mkdir
   move (mv, rename, ren)
   patch
   propdel (pdel, pd)
   propedit (pedit, pe)
   propget (pget, pg)
   proplist (plist, pl)
   propset (pset, ps)
   relocate
   resolve
   resolved
   revert
   status (stat, st)
   switch (sw)
   unlock
   update (up)
   upgrade

Subversion is a tool for version control.
For additional information, see http://subversion.apache.org/
```

動作確認を完了。

*再起動してもパスが通っていない場合は…
参考：http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1056781415
マイコンピュータ>プロパティ>システムの詳細設定>システムのプロパティウインドウの詳細設定タブ>[環境変数]
環境変数ウインドウのシステム環境変数の一覧から「path」選択し[編集]
システム変数の編集の変数値の最後に「;C:\Program Files\Subversion\bin」を付け加える*


## レッスン 3. リポジトリ用のディレクトリを作成
http://tracpath.com/bootcamp/learning_subversion.html#id5

任意の場所にフォルダ作成し、リポジトリを作成する。

```ruby:cmd
>cd C:\data\coding\
>mkdir repos
>cd repos
>svnadmin create C:\data\coding\repos\project1
```

※通常リポジトリ作成は最初の1回だけ。

ディレクトリを確認してみる

```ruby:cmd
C:\data\coding\repos>dir
 ドライブ C のボリューム ラベルがありません。
 ボリューム シリアル番号は AC86-3AD7 です

 C:\data\coding\repos のディレクトリ

2016/12/09  22:40    <DIR>          .
2016/12/09  22:40    <DIR>          ..
2016/12/09  22:40    <DIR>          project1
               0 個のファイル                   0 バイト
               3 個のディレクトリ  86,483,247,104 バイトの空き領域
```


## レッスン 4. 最初のインポート
http://tracpath.com/bootcamp/learning_subversion.html#id6

Subversion で開発する場合、「trunk」「tags」「branches」フォルダをリポジトリに追加する。
また、新規ファイル「readme.txt」を作成する（既存コードがある場合はそれを利用しても良い）。
とりあえず最初に「tmp」フォルダを作ってその中に上記フォルダ/ファイルを作成するが、今回リポジトリ登録後に削除する。

```ruby:cmd
>cd C:\data\coding\
>mkdir tmp
>mkdir tmp\trunk
>mkdir tmp\tags
>mkdir tmp\branches
>echo "Sample Project readme file" > tmp\trunk\readme.txt
```

次に、先のリポジトリにインポートする。

```ruby:cmd
>cd tmp
>svn import file:///c:/data/coding/repos/project1 -m "initial commit."
```

結果

```ruby:cmd
追加しています              branches
追加しています              tags
追加しています              trunk
追加しています              trunk\readme.txt

Committed revision 1.
```

リポジトリにインポート完了。
※リポジトリのパス指定はurl表記（ディレクトリに \ ではなく / を使う）ので注意。間違えると“不正なURLです”とエラーになる。

インポート後、tmpフォルダは削除する。すでにリポジトリ登録されてるため問題なし。

```ruby:cmd
>cd C:\data\coding
>del tmp
```

実行すると

```ruby:cmd
C:\data\coding\tmp\*、よろしいですか (Y/N)?
```

と表示されるので、yesで削除。
*※記事にある上記コマンドだとファイルしか削除できない。ディレクトリを削除するには次のコマンドで*

```ruby:cmd
>rd tmp
ディレクトリが空ではありません。
```

エラー。どうやら普通のrdコマンドでは中身ごと削除できないらしい。
まるごと削除したい場合は /s オプションを使うとのこと。
その際、管理者権限でコマンドプロントを起動しないと同じエラーとなる。
参考：http://www.adminweb.jp/command/dir/index7.html
参考：http://rms-099.hatenablog.jp/entry/20130121/1359223420

管理者権限で起動してコマンドを入力してみる。

```ruby:cmd
>rd /s tmp
```

ディレクトリまるごと削除できました。
cmdを通常権限で起動しなおして続けます。


## レッスン 5. チェックアウト
http://tracpath.com/bootcamp/learning_subversion.html#id7

チェックアウト…リポジトリに登録されたコードを自分のローカル作業環境にもってくること。
環境コピーをローカルに取得すること。

```ruby:cmd
C:\data\coding>svn checkout file:///c:/data/coding/repos/project1
A    project1\trunk
A    project1\trunk\readme.txt
A    project1\branches
A    project1\tags
リビジョン 1 をチェックアウトしました。
```

チェックアウトが完了。
*今回のチェックアウトでコピーされた場所は C:\data\coding\project1
どうやら作業コピーは svn checkout コマンドを実行した階層に作られるらしい。
ここで、最初の工程で作成した repos/ はリポジトリなので、この中での直接作業はしないことに気づきました。*


## レッスン 6. 作業ディレクトリで作業開始
http://tracpath.com/bootcamp/learning_subversion.html#id8

チェックアウトされた作業コピーフォルダで作業することになる。
作業ディレクトリを見てみる。

```ruby:cmd
C:\data\coding>cd project1

C:\data\coding\project1>dir
 ドライブ C のボリューム ラベルがありません。
 ボリューム シリアル番号は AC86-3AD7 です

 C:\data\coding\project1 のディレクトリ

2016/12/09  23:29    <DIR>          .
2016/12/09  23:29    <DIR>          ..
2016/12/09  23:29    <DIR>          branches
2016/12/09  23:29    <DIR>          tags
2016/12/09  23:29    <DIR>          trunk
               0 個のファイル                   0 バイト
               5 個のディレクトリ  86,481,719,296 バイトの空き領域
```

```ruby:cmd
C:\data\coding\project1>dir trunk
 ドライブ C のボリューム ラベルがありません。
 ボリューム シリアル番号は AC86-3AD7 です

 C:\data\coding\project1\trunk のディレクトリ

2016/12/09  23:29    <DIR>          .
2016/12/09  23:29    <DIR>          ..
2016/12/09  23:29                31 readme.txt
               1 個のファイル                  31 バイト
               2 個のディレクトリ  86,481,715,200 バイトの空き領域
```


## レッスン 7. 新しいファイルを作成・追加
http://tracpath.com/bootcamp/learning_subversion.html#id9

「trunk」内にtutorial.html を作成する。
エディタから新規作成でファイルを作る。

```ruby:html
<html>
<body>
<h1>Subversion チュートリアル</h1>
<ol>
  <li>リポジトリ作成</li>
  <li>作業コピー作成</li>
  <li>開発作業</li>
  <li>コミット</li>
</ol>
</body>
</html>
```

コマンドプロントからリポジトリにファイルを追加。

```ruby:cmd
>svn status
?       tutorial.html
```
status でリポジトリとローカルの状態を確認。? はリポジトリ管理外を示す。

*※元記事ではこれでリポジトリにコミットして追加されると書いてあるが、
別ディレクトリにcheckoutしてコピー取得してもtutorial.htmlが取得できてなかったので、別途、コミットする必要があるもよう。

参考：http://www.thekyo.jp/manual/subversion/svn.ref.svn.c.status.html
status コマンドはあくまで、作業コピーのファイルやディレクトリ状態を表示するだけのよう。

記事ではまだコミットのやり方が出てないが、先項のコミットのコマンドでやってみる。
…コミットしたけど反映されない……先にaddコマンドもやる必要があるのかも。
参考：http://www.thekyo.jp/manual/subversion/svn.ref.svn.c.add.html　*

```ruby:cmd
C:\data\coding\project1\trunk>svn add tutorial.html
A         tutorial.html

C:\data\coding\project1\trunk>svn commit -m "tutorial.htmlを作成"
追加しています              tutorial.html
ファイルのデータを送信しています .
Committed revision 2.
```

コミットできたもよう。
他の適当な場所にフォルダを作ってチェックインでhtmlファイルが反映されているかを確認。
…無事にリポジトリに反映されました。


## レッスン 8. 新しいディレクトリを作成・追加
http://tracpath.com/bootcamp/learning_subversion.html#id10

ディレクトリ、ディレクトリに含まれるファイル群の追加。

```ruby:cmd
>mkdir A
>mkdir B
>echo hello world! > B\hello.txt
>echo こんにちは > B\こんにちは.txt
```

エクスプローラー上でフォルダとファイルが出来ているのが確認できる。
svn status で状態を確認。

```ruby:cmd
>svn status
?       A
?       B
```

A/B フォルダが管理外になっている（?が表示）のが確認できる。
それぞれのフォルダをリポジトリ追加準備のコマンドを実行。

```ruby:cmd
C:\data\coding\project1\trunk>svn add A
A         A

C:\data\coding\project1\trunk>svn add B
A         B
A         B\hello.txt
A         B\こんにちは.txt
```

フォルダをaddすると中に含まれるファイルもaddされるので注意。
これで準備が整ったのでコミット。
コマンドの「」はコミット時のコメント。後で内容が確認できるよう変更点や修正内容など分かりやすく書く。

```ruby:cmd
C:\data\coding\project1\trunk>svn commit -m "A,B フォルダを一括登録した"
追加しています              A
追加しています              B
追加しています              B\hello.txt
追加しています              B\こんにちは.txt
ファイルのデータを送信しています ..
Committed revision 3.
```


## レッスン 9. ファイルを更新
http://tracpath.com/bootcamp/learning_subversion.html#id11

中のファイルを編集して、バージョン管理システムを実際に使ってみる。
trunk/tutorial.html をエディタで編集。

```ruby:tutorial.html
<html>
<body>
<h1>Subversion チュートリアル</h1>
<ol>
  <li>リポジトリ作成</li>
  <li>作業コピー作成</li>
  <li>開発作業</li>
  <li>コミット</li>
  <li>[-m]はコミット時の更新内容を記述します</li>
  <li>バージョン管理システムの更新</li>
</ol>
</body>
</html>
```

tutorial.html に変更を加えて保存すると、エクスプローラー上のアイコンに赤！マークが付く。
svn status で状態を確認。

```ruby:cmd
C:\data\coding\project1\trunk>svn status
M       tutorial.html
```

「M」は作業コピー内のファイルに変更があったことを示す。
続いてコミット。

```ruby:cmd
C:\data\coding\project1\trunk>svn commit -m "手順を追加した"
送信しています              tutorial.html
ファイルのデータを送信しています .
Committed revision 4.
```

もう一度、tutorial.html に変更を加える

```ruby:tutorial.html
<html>
<body>
<h1>Subversion チュートリアル</h1>
<ol>
  <li>リポジトリ作成</li>
  <li>作業コピー作成</li>
  <li>開発作業</li>
  <li>コミット</li>
  <li>[-m]はコミット時の更新内容を記述します</li>
  <li>バージョン管理システムの更新</li>
  <li>ファイルの更新</li>
</ol>
</body>
</html>
````

このファイルはリポジトリよりも新しい修正が追加されている状態。コミットの前に内容を確認。

```ruby:cmd
C:\data\coding\project1\trunk>svn diff tutorial.html
Index: tutorial.html
===================================================================
--- tutorial.html       (リビジョン 4)
+++ tutorial.html       (作業コピー)
@@ -8,6 +8,7 @@
   <li>繧ｳ繝溘ャ繝・/li>
   <li>[-m]縺ｯ繧ｳ繝溘ャ繝域凾縺ｮ譖ｴ譁ｰ蜀・ｮｹ繧定ｨ倩ｿｰ縺励∪縺・/li>
   <li>繝舌・繧ｸ繝ｧ繝ｳ邂｡逅・す繧ｹ繝・Β縺ｮ譖ｴ譁ｰ</li>
+  <li>繝輔ぃ繧､繝ｫ縺ｮ譖ｴ譁ｰ</li>
 </ol>
 </body>
 </html>
\ No newline at end of file
```

liタグ前の「＋」記号は作業コピーに追加されたことを示している。

*文字化けしてるうえ、元記事とは違う「\ No newline at end of file」というメッセージが…　
参考：http://d.karashi.org/20101018.html　
どうやら diff するファイルの末尾に改行が無いと表示されるものらしい。*

*文字化けはコマンドプロントの文字コードがsjisなのが原因らしい。
参考：http://d.hatena.ne.jp/ty-zero/20091110/1257826284
参考：http://piyopiyocs.blog115.fc2.com/blog-entry-830.html
utf-8に変更すれば直るらしいですが、バグもあるそうなので、今回は割愛してこのまま進めます。*

とりあえず、変更内容が確認できたのでコミット

```ruby;cmd
C:\data\coding\project1\trunk>svn commit -m "さらに手順を追加"
送信しています              tutorial.html
ファイルのデータを送信しています .
Committed revision 5.
```



## レッスン 10. ファイルを移動
http://tracpath.com/bootcamp/learning_subversion.html#id12

エクスプローラーでファイルを移動すると作業コピーとリポジトリに差異が生まれる。
/project1/trunk/tutorial.html を /projext1 配下に移動した場合どうなるか見てみる。

エクスプローラー上で tutorial.html ファイルを移動し（ファイルアイコンに ? マークが付く）、
svn status で確認してみる。

```ruby:cmd
C:\data\coding\project1>svn status
!       trunk\tutorial.html
?       tutorial.html
```

「!」アイテムが失われた状態
「?」リポジトリ管理外のファイルを見つけた
ことを表す。

*記事中には何も書いていないが、ここでコミットした方が良かったらしい
後で気づいて、取り消しコマンドを svn revert {dir,file} を使って状態を戻した。
参考：http://qiita.com/narumi_/items/9a786588cc5670224219 
再度、改めてエクスプローラ上でファイルを移動し、コミット。*

※後でやり直したコマンド

```ruby:cmd
C:\data\coding\project1>svn add tutorial.html
A         tutorial.html

C:\data\coding\project1>svn commit -m "tutorial.htmlを移動"
追加しています              tutorial.html
ファイルのデータを送信しています .
Committed revision 6.
```

記事には無いが、先の tutorial.html をエクスプローラで元の場所に戻してみる（ファイルアイコンが緑チェックに戻る）。
*~~この作業は取り消したので必要ない。→と思ったけど、コミットで tutorial.html は緑チェックが付いたが、/truk は赤！のままになっている。やっぱりエクスプローラ上の移動は取り消して、次項のコマンドで移動させる必要があったのかもしれない。~~ ←やはり戻すのが正解だったようです（レッスン 11. 記事では trunk/tutorial.html に戻っているので）。*


今度はコマンドプロントからファイル移動してみる。

```ruby:cmd
C:\data\coding\project1>svn move trunk\readme.txt .
A         readme.txt
D         trunk\readme.txt
```

readme.txt の後に引数「.」を忘れずに付ける（ここでは /trunk 配下を指定）
「A」ファイルが追加という意味
「D」ファイルが削除されたという意味
※ファイルの移動は、svn copy の後 svn delete 実行することと同じ。

これらの操作もコミットするまではリポジトリに反映されないので注意。

```ruby:cmd
C:\data\coding\project1>svn commit -m "readme.txtを移動"
追加しています              readme.txt
削除しています              trunk\readme.txt

Committed revision 7.
```

## レッスン 11. ファイル名を変更
http://tracpath.com/bootcamp/learning_subversion.html#id13

ファイル名の変更もエクスプローラーではなく、svn rename で変更する必要がある。

```ruby:cmd
C:\data\coding\project1>svn rename tutorial.html tutorial2.html
A         tutorial2.html
D         tutorial.html

C:\data\coding\project1>svn commit -m "ファイル名を変更"
削除しています              tutorial.html
追加しています              tutorial2.html

Committed revision 8.
```


## レッスン 12. ファイルを削除
http://tracpath.com/bootcamp/learning_subversion.html#id14

ファイル削除してみる。

```ruby:cmd
C:\data\coding\project1>svn delete tutorial2.html
D         tutorial2.html
```

続いてコミット

```ruby:cmd
C:\data\coding\project1>svn commit -m "tutorial2.htmlを削除"
削除しています              tutorial2.html

Committed revision 9.
```

## レッスン 13. 履歴を確認
http://tracpath.com/bootcamp/learning_subversion.html#id15

コレまでの変更履歴を確認。

```ruby:cmd
C:\data\coding\project1\trunk>svn log
------------------------------------------------------------------------
r1 | USER | 2016-12-09 22:59:12 +0900 (2016/12/09 (金)) | 1 line

initial commit.
------------------------------------------------------------------------
```

記事に記載されてる結果と違い、最初のコミットしか表示されませんでした。。
ひょっとしたら以前やったTortoiseSVNと競合してる？
とりあえず、無視して進めます。


svn diff でファイルの差分を表示

```ruby:cmd
>svn diff
```

何も表示されない。。。
どこで間違ったのか分かりませんが、これまでの手順が違ってたのかもしれません。
記事ではcmdを管理者権限で起動されているようなので、これが原因かも。
また時間を見つけて最初からやり直してみようかと思います。

## 最後に
http://tracpath.com/bootcamp/learning_subversion.html#id16

これでSubversion基本学習用チュートリアルは終了。 
ありがとうございました。