# 6.2.1\. 用SVN操作GitHub
2008年4月1日,GitHub宣布推出基于SVN的SVNHub網站,后證實這是一個愚人節玩笑[[1]](https://github.com/blog/31-back-to-subversion)。2010年愚人節,類似消息再起,可這一次不再是玩笑[[2]](https://github.com/blog/626-announcing-svn-support)。即對于GitHub上的每一個Git版本庫,現在都可以用SVN命令進行操作。更酷的是 SVN 版本庫使用的是和 Git 版本庫同樣的地址[[3]](https://github.com/blog/966-improved-subversion-client-support)。
例如用下面的 Git 命令訪問本書的 Git 版本庫,顯示版本庫包含的引用。其中分支master用于維護書稿,分支gh-pages保存書稿編譯后的 HTML 網頁用于在 GitHub 上顯示。
```
$ git ls-remote --heads https://github.com/gotgit/gotgithub
ce5d3dda9b9ce8ec90def1da10181a094bea152f refs/heads/gh-pages
c4d370b1b0bafb103de14e104ca18b8c31d80add refs/heads/master
```
如果使用 SVN 命令訪問相同的版本庫地址,Git 服務器變身為一個 SVN 服務器,將Git的引用對應為 SVN 風格的分支。如下:
```
$ svn ls https://github.com/gotgit/gotgithub
branches/
trunk/
$ svn ls https://github.com/gotgit/gotgithub/branches
gh-pages/
```
SVN 支持部分檢出,下面命令將整個主線trunk(相當于 Git 版本庫的master分支)檢出。
```
$ svn checkout https://github.com/gotgit/gotgithub/trunk gotgithub
A gotgithub/Makefile
A gotgithub/README.rst
...
Checked out revision 30.
```
還可以使用 SVN 命令創建分支,即相當于在 Git 版本庫中創建新的引用。測試發現GitHub 尚不支持 SVN 遠程拷貝創建分支,需要通過本地拷貝再提交的方式創建新分支。操作如下:
1. 為避免檢出版本庫所有分支過于耗時,在檢出時使用--depth=empty參數。
```
$ svn checkout --depth=empty \
https://github.com/gotgit/gotgithub gotgithub-branches
Checked out revision 30.
```
1. 進入到檢出目錄中,更新出trunk和branches兩個頂級目錄。
```
$ cd gotgithub-branches
$ svn up --depth=empty trunk branches
A trunk
Updated to revision 30.
A branches
Updated to revision 30.
```
1. 通過拷貝從主線trunk創建分支branches/svn-github。
```
$ svn cp trunk branches/svn-github
A branches/svn-github
$ svn st
A + branches/svn-github
```
1. 提交完成分支創建。
```
$ svn ci -m "create branch svn-github from trunk"
Authentication realm: <https://github.com:443> GitHub
Username: gotgithub
Password for 'gotgithub':
Adding branches/svn-github
Committed revision 31.
```
1. 用 Git 命令可以看到服務器上創建了一個新的同名引用,并且指向和master一致。
```
$ git ls-remote --heads https://github.com/gotgit/gotgithub
ce5d3dda9b9ce8ec90def1da10181a094bea152f refs/heads/gh-pages
c4d370b1b0bafb103de14e104ca18b8c31d80add refs/heads/master
c4d370b1b0bafb103de14e104ca18b8c31d80add refs/heads/svn-github
```
下面嘗試一下用 SVN 命令在新創建的分支svn-github中提交。
1. 進入到之前檢出完整主線trunk的gotgithub目錄,并將工作區切換為分支branches/svn-github。
```
$ cd ../gotgithub
$ svn switch https://github.com/gotgit/gotgithub/branches/svn-github
At revision 31.
```
1. 修改文件,查看工作區狀態。
```
$ svn st
M 06-side-projects/040-svn.rst
```
1. 用 SVN 提交。
```
$ svn ci -m "GitHub svn client support improved. Refs: http://git.io/svn"
Sending 06-side-projects/040-svn.rst
Transmitting file data .
Committed revision 32.
```
1. 同樣查看 Git 版本庫的更新,會發現svn-github分支的指向已和master不同。
```
$ git ls-remote --heads https://github.com/gotgit/gotgithub
ce5d3dda9b9ce8ec90def1da10181a094bea152f refs/heads/gh-pages
c4d370b1b0bafb103de14e104ca18b8c31d80add refs/heads/master
64b80cb5331e28fdfb896e2ab3085779bf6ca019 refs/heads/svn-github
```
- 前言
- 1. 探索GitHub
- 1.1. 什么是GitHub
- 1.2. GitHub亮點
- 1.3. 探索GitHub
- 2. 加入GitHub
- 2.1. 創建GitHub賬號
- 2.2. 瀏覽托管項目
- 2.3. 社交網絡
- 3. 項目托管
- 3.1. 創建新項目
- 3.2. 操作版本庫
- 3.3. 公鑰認證管理
- 3.4. 版本庫鉤子擴展
- 3.5. 建立主頁
- 4. 工作協同
- 4.1. Fork + Pull模式
- 4.2. 共享版本庫
- 4.3. 組織和團隊
- 4.4. 代碼評注
- 4.5. 缺陷跟蹤
- 4.6. 維基
- 5. 付費服務
- 5.1. GitHub收費方案
- 5.2. GitHub企業版
- 6. GitHub副產品
- 6.1. GitHub:Gist
- 6.2. 其他版本控制工具支持
- 6.2.1. 用SVN操作GitHub
- 6.2.2. 用Hg操作GitHub
- 6.3. 客戶端工具
- 6.4. 其他
- 7. 附錄:輕量級標記語言
- 貢獻者列表