GitからSubversionを理解するためのメモ

# これは何？
* 今更聞けないけど、Subversion（以下、svn）を触らないといけないことになったので、メモ
* 前提としてGitは知っているという前提

【注意】
理解したことをまとめてるだけなので、変なことを書いているかもしれない。そしたら教えていただきたい。

# 導入（インストール）

1. 今回導入するのはWindowsなので、[Apache Subversionのページ](http://subversion.apache.org/packages.html#windows)からWindowsインストーラを探してくる。
2. いくつかダウンロード先があり、何が違うのか、何を選んだら適切なのかよくわからない。
とりあえず、一番下のものを選んだ。svn serverも同封されていることも確認。
   http://sourceforge.net/projects/win32svn/

【参考資料】

* http://www.kkaneko.com/rinkou/redmine/subversion.html

# 運用方法は？（Gitと比較しながら）

標準的な？フォルダ構成（慣習らしいので従う）

```:フォルダ構成
-hoge-+-trunk
      +-branches
      +-tags
```

* trunk - git の master branchに相当する
* branches - git の branch に相当する
* tags - git のタグに相当する

Gitでは、tag, branchが機能として組み込まれているが（仕様）
Svnでは、tag, branchをフォルダとして分けて識別する（慣習）。


【参考資料】

* http://www.caldron.jp/~nabetaro/svn/svnbook-1.4-final/svn.branchmerge.using.html
* http://promamo.com/?p=809
* http://pokotsun.mydns.jp/?p=790
* http://qiita.com/mountcedar/items/e756bb9136e3b1722bb2

# リポジトリの作り方のコマンドは？
## git initに相当すること
git : ```git init --bare``` カレントディレクトリにリポジトリが作られる。
svn : ```svnadmin create c:\svn-repo\test-repo``` 指定したパス先にリポジトリが作られる。

リポジトリができたかどうか確認する。
```svn info file:///c:/svn-repo/test-repo```

※指定するファイル・パスが、```c:\svn-repo\test-repo``` から　```file:///c:/svn-repo/test-repo```　に代わるので注意。
（￥マークが／（スラッシュ）に代わる）

## trunk/branches/tags のフォルダを作る（svnだけ）

実際は、一行で。

```bash:trunk,branches,tagsを作る
svn mkdir 
file:///c:/svn-repo/test-repo/trunk 
file:///c:/svn-repo/test-repo/branches 
file:///c:/svn-repo/test-repo/tags
-m "create init folders."
```

# git clone に相当すること
svnではcheckoutというらしい。
git : ```git clone file:///c:\svn-repo\test-repo``` （暗黙的にmaster branchからcloneされると考える）
svn : ```svn checkout file:///c:/svn-repo/test-repo/trunk```　
（svnではtrunkがgit masterブランチ相当なのでこうなる）
（このままだとtrunkというフォルダがカレントディレクトリに作成されてしまう。）

カレントディレクトリに直にcheckout(clone）する場合
```svn checkout file:///c:/svn-repo/test-repo/trunk .```

作成されるカレントディレクトリに名前を指定してcheckout(clone）
```svn checkout file:///c:/svn-repo/test-repo/trunk hoge```


【参考資料】

* http://hydrocul.github.io/wiki/commands/svn.html

# git add/commit/push に相当すること
```svn add test.txt```
```svn commit -m "xxxxx" && svn update```

※　gitの場合、cloneした時の向き先は、originにcloneしたリポジトリ。svnも同様になっている模様。
※　svnの場合、ファイルステージング？と呼ぶような場所がないので、add -> commit で git の add/commit/pushの操作に相当する。
※  ```svn update```は、何に相当するのかよくわからない…（要調査）

## git remote 的な話。

commit（gitでいうところのpush）する際の向き先について。
svnは集中型のリポジトリなので、commitの向き先が変わるということはない。（違うサーバになるということはない）

（gitの話）commitする時に、どのブランチにpushするか？というのは、
```git push -u origin XXXXX```` で指定してあげます。

（svnの話）commitするときに、pushされるので、あらかじめ```git checkout```相当のことをしておく必要がある。
```svn switch file:///``` 的な感じで。


# git checkout -b XXXXX に相当すること
```git checkout -b XXXXX```は、XXXXXという名前のブランチを作って、そのブランチに移動する。というもの。
実際に一度にはできないみたい？なので

## ブランチの作成

```git branch XXXX``` に相当

```svn copy file:///c:/svn-repo/test-repo/trunk file:///c:/svn-repo/test-repo/branches/branch1 -m "hoeghoge"```

## ブランチに移動

```git checkout XXXX```　に相当

```svn switch svn://id@host/path/to/svnroot/branches/branch1```


# そのほか参考資料
svn -> git に移行をサポート？

* http://japan.blogs.atlassian.com/2014/03/git-svn-tips-and-tricks/
* https://www.atlassian.com/ja/git/migration#!migration-share

周りの人に聞いた結果、SVNではあまりコマンドベースで触らないらしい。
Windowsでは、[TortoiseSVN](http://tortoisesvn.net/)等を使ってGUIから触るのが一般的のよう。