建立 Subversion 服務器 by Michael

大三的做嵌入式實驗的時候就知道了svn,可是平時代碼都是隨便寫寫,也沒有怎麼好好管理,導致版本管理十分混亂,很多修改都無跡可尋。最近正好要幫實驗室寫點東西,又恰逢春節時間充足,就打算抽點時間研究一下。於是在網上發現了一篇好文,特意轉載下來排版一下,以備日後參考。原文來自:

http://bemike.org/posts/258

http://bemike.org/posts/260

http://bemike.org/posts/261

http://bemike.org/posts/262

**********************************************************************************


建立 Subversion 服務器


目錄:
·     序言
·     建立自己的 Repository
·     用 svnserve 建立 subversion 服務器
·     在 Apache 下建立 subversion 服務器

1. 序言

像我以前說過的,subversion 是一個非常好的版本控制系統。如果你對版本控制這個概念不太瞭解的話,我來簡單解釋一下。比如我有一個項目,有幾百個文件,包括項目的相關文檔,圖表,和一些視頻音頻文件,它們都被放在電腦的一個文件夾內。隨着項目的發展,文件夾內的會增加新的文檔圖表等文件,而老的文件也會被修改,同時也許會有一些文件會被刪除。在版本控制系統下,每一次對該項目文件夾下的改動,都會被記錄,如果哪個文件被刪錯了,或是想把文檔恢復到以前的版本,可以輕而易舉的達到。更了不起的是,如果該項目被一個團隊來執行,該團隊的每一個成員都可以對項目內的文件進行管理和同步,這樣就可以保持大家永遠 on the same page.


如果我說的不清楚,可以參考一下 Google Docs 的 revision 功能,對於一篇文檔,你可以回到以前的版本。這個就是一個簡單的版本控制。本質上說,subversion 乾的活和 Google Docs 乾的一樣,但不同的是,subversion 使用上更加靈活,功能上更加強大。

對於普通的個人應用,建立 subversion 服務器完全可以在自己的電腦上進行,而且非常簡單,因爲完全不用去考慮安全的因素,所以也不必設置相關的驗證身份的程序。如果想把“項目文件夾”(我不知道應該怎麼翻譯,以下改稱 repository 或 repo)放在局域網上,甚至互聯網上,就相對複雜一些了。

除了這篇序言,我準備分三篇說說如何建立 subversion 服務器,Windows 和 Linux 都適用,因爲這幾天我一直都在 Linux 下,例子就舉 Linux 下的,Windows 下也是一樣的,只需把路徑格式換成 Windows 的就可以了。

2. 建立自己的 Repository

2.1 基礎知識

在 Subversion (以下簡稱 svn) 下有兩個概念要清楚,一個是 repository (以下簡稱 repo), 一個是 working copy (以下簡稱 wc)。前者是項目所在的地方,後者是你做修改的地方,兩者的內容可以完全一樣,也可以不完全一樣,兩者在電腦上一般都表現爲文件夾或目錄。你在 wc 裏所做的改動可以 commit 到 repo 中,如果你成功把 wc 中的內容 commit 到 repo 中,那麼 repo 就會自動更新一個版本 (revision)。如果不進行 commit 操作,你在 wc 上做的任何修改對不會對項目產生任何影響。如果你願意,可以隨時把 wc 替換爲任何一個 revision (包括以前的老版本)。

要使用 svn 就要先安裝,ubuntu 的用戶很簡單,直接在終端處輸入:
sudo apt-get install subversion
就完成了,Windows 需要到下載頁面下載 Windows 版本,我建議下載 .zip 包,直接解壓就可以使用了。

在 windows 下使用最好把 svn 的執行文件路徑加入到 PATH 這個環境變量中去,以便能夠在任何路徑下都可以正常使用,你很快就能發現,這點很重要。

2.2 建立自己的 repo
假設我要正在製作一個 wordpress 主題,我需要對製作過程中的文件建立一個 repo, 以便在需要時可以隨時“回到過去”。製作中的主題所在的目錄爲 /foo/bar,我準備在 /home/michael 下建立一個 repo,那麼我需要這麼做:
#建立一個名爲 theme 的 repository
svnadmin create /home/michael/theme
#把 /foo/bar 下的內容導入到 theme 中並建立 repo,這個 repo 的版本號是 1。
svn import -m "第一次導入" /foo/bar file:///home/michael/theme

從此以後,如果在本地電腦上想 checkout 剛纔建立的 repo 只需在任何路徑下輸入
svn checkout file:///home/michael/theme baz  #建立一個名爲 baz 的 working copy

就完成了一個 working copy 的建立。Windows 用戶需要把路徑格式換成 file:///X:/path/to/repo。其中 X: 爲 repo 的盤符。

在 wc 中你可以任意修改,如果不滿意可以直接用 svn revert 命令恢復。在適當的時候你覺得需要把你的修改提交到 repo 中去了,可以用:
svn commit -m "blah blah"

這樣就產生了新的版本。”blah blah” 是給這個新版本的註解。

2.3 svn 命令
要注意的一點是,在 wc 下做文件操作時,比如刪除或移動文件,不能直接用 rm, mv 來進行,這樣 svn 不能追蹤到文件的變化,你必須使用 svn del 或是 svn move 來完成刪除或移動的操作。下面舉幾個命令的例子:


svn add filename         #新增一個文件
svn move filename foo/bar/baz   #移動 filename 到 foo/bar/baz 下
svn rename filename1 filename2  #給文件改名

跟普通的 DOS/Linux 命令沒什麼不同,更多具體的命令可以參考 svn book。Windows 用戶如果覺得命令行太麻煩,可以用一個名叫 TortoiseSVN 的圖形化前端來代替命令行。

2.4 總結

通過以上的內容我們已經可以:

1.建立 repository
2.導入項目到 repo 中
3.建立 working copy
4.一些簡單的 svn 命令

以上對個人的小項目來說基本夠用了,但如果要用的得心應手還是不行,大家可以用 svn help 命令來查看其它命令的用法。如果你對命令行操作感到不適應,這裏尤其建議 Windows 下的用戶使用上面提到的 TortoiseSVN 軟件,完全圖形化界面,使用非常簡單。如果需要幫助,可以看看 Lifehacker 上的使用指南。

下面兩篇準備談談 Subversion 在服務器上的應用,包括建立服務器以及用戶的驗證。


3. 用 svnserve 建立 subversion 服務器

讓我們來點真的吧


Part1 中介紹了在本機上建立 repo 自用,但如果想把 repo 放在網上供其他用戶 checkout,則還需要架設 svn 服務器--這也是本文的目的。

svn 服務器可以用兩種方法架設,一種比較簡單,使用 svn 自帶的 svnserve 實用程序,另一種直接利用 Apache 架設,需要加載額外的模塊。svnserve 簡單夠用,我打算在這篇裏先說說怎麼用它架設 svn 服務器。

svnserve 就包含在 subversion 的程序包中,你的電腦上安裝了 subversion 就自動有了 svnserve 這個小型 svn 服務器。這個服務器跟 Apache 這個巨無霸比起來簡單輕便,使用自己的一套協議,訪問時區別於 http:// 前綴,使用 svn:// 前綴。

3.1 用 svnserve 搭建 svn 服務器
我們要把 svnserve 運行起來,我將在例子中介紹具體的使用方法。

下面假設我在本機上運行 svnserve,IP 爲 192.168.0.1,這個 svn 服務器爲局域網內的電腦提供 svn 服務。我打算把 svn 服務器的訪問地址設爲 http://192.168.0.1/svnprojects/projectX,其中 X 爲不同的多個項目。整個過程如下(以 windows 下爲例):
首先確定 repo 在本機上的儲存的位置,比如我準備把 repo 放在 D:/svnprojetcs/ 下,那麼在命令行運行 svnserve -d -r d:/svnprojects 就可以了。其中 -d 參數讓 svnserve 運行在後臺,-r 參數限定了 repo 在網絡上可以訪問的地址。這樣如果網絡上其它的計算機要 checkout 這個服務器,只需要輸入
svn checkout svn://192.168.0.1/project1

而 repo 在本機上實際的位置是 d:/svnprojects/project1。同理,如果想 checkout project2,則把上面的 project1 改成 project2 就可以了。

到此,一個簡單的 svn 服務器就算是基本架設好了。但如果要正常使用,我們還需要設定用戶的驗證和相應的權限。

現在我們先建立一個叫 project1 的 repo,然後轉到 project1中:
svnadmin create d:/svnprojects/project1
cd d:/svnprojects/project1

project1 目錄下有一堆目錄,進入 conf 並打開 svnserve.conf 這個文件,找到以下幾行,並把前面的註解符號 ‘#’ 去掉,注意千萬在每行的前面別留任何空格:
anon-access = read
auth-access = write
password-db = passwd

其中 anon-access 和 auth-access 分別爲匿名和有權限用戶的權限,默認給匿名用戶只讀的權限,這很好,我們不需要改它們。但如果想拒絕匿名用戶的訪問,只需把 read 改成 none 就能達到目的。password-db 後的 passwd 則爲定義用戶名及密碼的文件路徑。這個文件默認跟 snvserve.conf 在同一個目錄,下面看看怎麼配置 passwd 中的內容:

[user]
# harry = harryssecret
# sally = sallyssecret

harry 和 sally 這兩行分別定義了可以對 repo 進行寫入的用戶的用戶名和密碼。我們可以在下面加上自己的用戶名和密碼,比如
testsvn = tester

這樣就給了用戶 testsvn 往 repo 中寫的權限。存盤退出後,svn 服務器就算正式可以運行了!把所有需要管理的項目都放在 d:/svnprojects 這個目錄下,像正常那樣用 svnadmin create 命令建立 repo,如果要 checkout repo,則在命令行中輸入:
svn checkout svn://192.168.0.1/project1

如果要 commit 剛需要輸入剛纔設置好的用戶名和密碼:
svn commit -m "we are commiting changes!" --username testsvn --password tester

3.2 給 Windows 用戶的建議

如果你打算在 Windows 系統上運行 svnserve,只是簡單的在命令行輸入 svnserve -d -r d:/svnprojects 不是個好方法,一是每次都這麼幹太麻煩,二是服務器啓動後爲了保持它的運行,你必須讓命令提示符窗口一直懸在桌面上,影響美觀。最好是把 svnserve 作爲系統的一個進程每次啓動自動運行:
D:/> sc create svn
binpath= "D:/svn/bin/svnserve.exe --service -r D:/svnprojects"
displayname= "Subversion Server"
depend= Tcpip
start= auto

把當中的路徑換成你的 svn 安裝目錄就可以了。



4. 在 Apache 下建立 subversion 服務器

在 Apache 中部署 Subversion 實際上並不比用 svnserve 難多少,它的難點在於一般人沒有修改 Apache 配置的權限,如果你有相應的修改權限,那麼搭建一個 svn 服務器不是一件難事,我們來看看應該怎麼配置。

4.1 準備工作
首先確定 Apache 正確安裝,mod_dav 和 mov_dav_svn 這兩個模塊也被啓用,在 Debian 系的 Linux 上可以這麼安裝:
sudo apt-get install apache2 subversion libapache2-svn

在 Windows 平臺上,可以下載一個 XAMPP,Apache MySQL PHP 什麼的就都有了。

確定 mod_dav 和 mod_dav_svn 被打開:
a2enmod dav dav_svn

4.2 基本設置
以上的準備工作做完後,就正式開始了,還是拿 part2 的機器網絡環境,同樣的例子。

我準備讓 repo 的網絡訪問地址成爲 http://192.168.0.1/svnprojects/projectX,

修改 /etc/apache2/conf 下的 httpd.conf,加入如下代碼:

<Location /svnprojects>
DAV svn
SVNParentPath /path/to/svnprojects
</Location>

更多詳細的<Location>命令用法請參見 Apache 手冊,下同。SVNParentPath 命令用來把網絡訪問地址和 repo 的實際地址對應起來。

這樣就設置完了,如果你把 repo 建立好了,現在就已經可以 checkout 了,輸入:
svn checkout http://192.168.0.1/svnprojects/project1

4.3 設定用戶的權限和驗證
但這樣肯定是不夠的,因爲還沒有設定相應的用戶權限,現在不管誰都可以往 repo 裏塞東西,爲了更好的控制,我們還需要設定訪問權限,比如讓指定的用戶可以 commit,其他的只能 checkout。

因爲我們在 Apache 上,所以訪問權限的控制就可以直接借用 Apache 的,首先爲你的用戶設定用戶名和密碼:
htpasswd -cmb /path/to/passwdfile/passwords user1 test1

這樣就把用戶名和密碼儲存在 passwords 中了,加密方式爲 MD5。如果需要添加新的用戶,
htpasswd -mb /path/to/passwdfile/passwords user2 test2
以此類推。

然後回到我們在 httpd.conf 中添加的代碼,修改一下:
<Location>
DAV svn
SVNParentPath /path/to/svnprojects
AuthType Basic
AuthName "Test Repository"
AuthUserFile /path/to/passwdfile/passwords
<LimitExcept GET PROPFIND OPTION REPORT>
Require valid-user
</LimitExcept>
</Location>

在這段代碼的控制下,任何人都可以對 repo 進行 checkout,但只有 user1 和 user2 纔可以 commit,<LimitExcept> 的作用是控制 HTTP 請求,如果 HTTP 請求是 GET PROPFIND OPTION REPORT 中的一種,則不需要去驗證用戶。

最後,你需要把 repo 所在的目錄和文件的所有權都改成系統中操作 Apache 的用戶,這樣在 commit 的時候纔會被 Apache 認可。在 Ubuntu 中,這個用戶叫 www-data:
sudo chown -R www-data /path/to/repo

如果你用其它系統或是用 Windows,可以在 Apache 的配置文件中找到 User 這個命令來知道應該把目錄的所有權交給誰。

以上就是一個初步的 Subversion 服務器的搭建,這一篇考慮到實際上用的人可能不多,要用的人估計肯定會自己配置,因此我寫的不夠細緻,比如說沒有說到基於 SSL 的設置步驟。如果你確實需要了解,可以聯繫我,我們一起探討。




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章