① 如何配置自己的linux svnserver伺服器
一、新建並初始化版本庫
1.新建代碼倉庫
# svnadmin create /home/myrepos
這樣,我們就在/home目錄下新建了版本庫myrepos。
2.初始化代碼倉庫
#mkdir -p code/{branches,tags,trunk}
按照svn手冊上的建議,我們版本庫的布局採用branches/tags/trunk這樣的三個目錄。然後可以將代碼直接拷貝的trunk目錄,也可以隨後採用svn add的方式添加。
#svn import code file: ///home/myrepos
將我們構造好的版本庫布局(以及代碼,如果已經拷貝到trunk下的話)提交到版本庫。由於這里我們是在本地操作,因此可以直接使用file協議方式提交。格式為:file:// + 版本庫絕對的路徑
OK,到這里我們已經構建了一個本地版本庫,可以再本地使用svn ci的方法得到版本庫的副本了。如果前面只是提交了版本庫布局,而沒有提交代碼的話,則可以通過如下命令,提交版本代碼:
#svn co file: ///home/myrepos/trunk repos
通常只從主線目錄trunk下取出源碼,放在了新建的repos目錄。然後可以將源碼拷貝到repos目錄。
執行以下兩條命令將代碼添加的版本庫。
#svn add *
#svn ci * -m "Committed codes"
首先需要將拷貝的代碼加入到當前的副本中,然後將代碼提交到版本庫。
二、配置並啟動svnserve
1. 配置svnserve
這一步主要完成遠程用戶訪問版本的許可權。
在版本庫目錄下有個conf目錄:home/myrepos/conf,該目錄包含三個文件:authz,passwd,svnserve.conf。
(1)svnserve.conf
此文件重點的設置內容如下:
anon-access = read
auth-access = write
password-db = passwd
authz-db = authz
其中,anon-acces s和auth-access分別代表設置匿名用戶和授權用戶的訪問許可權。read代表只讀,write代表可讀可寫,還有一個none,代表禁止訪問。如果不想讓匿名用戶訪問的話,可以設置anon-access = none。
password-db為保存版本庫的用戶名和密碼,通常為conf目錄下的passwd文件。
authz-db指向的文件,主要用於將用戶進行分組,並賦予不同的組不同的許可權。譬如有多個目錄時,設置某個組的用戶只可以訪問其中的那些目錄。
(2)passwd
如前面介紹,這個文件的主要內容如下
[users]
harry = harrysecret
sally = sallyssecret
以上兩行就是可以訪問版本庫的用戶名和密碼。格式為:user = passwd。
(3)authz
[groups]
# harry_and_sally = harry,sally
# [/foo/bar]
# harry = rw
# * =
# [repository:/baz/fuz]
# @harry_and_sally = rw
# * = r
以上就是authz文件的格式。先給用戶分組,然後分別設置每個組的工作目錄以及許可權等。
本文的講解並未用到authz的配置。
2. 啟動svnserve
#svnserve -d -r /home/
svnserve將以守護進程的方式運行。同時,通過-r選項指定了版本庫的目錄。這個目錄可以是版本庫的上級目錄(/home),也可以是版本庫的目錄(/home/myrepos)。具體的區別會在後面講到。當然,也可以不用-r指定。
三、遠程訪問svnserve。
假設版本伺服器的地址為10.1.1.1,那麼用戶可以在遠程linux端輸入命令:
#svn checkout svn://10.1.1.1/myrepos myrepos
這樣版本庫的所有內容都被check出來,存放在當前目錄myrepos下。這里相當於使用svn協議,不用搭建http伺服器。
如果啟動svnserve的時候,-r選項指定的是版本庫的目錄,譬如/home/myrepos,那麼檢出版本的時候,執行的命令為:
#svn checkout svn://10.1.1.1/ myrepos
如果啟動svnserve是沒有指定-r選項,則要輸入版本庫的絕對路徑:
#svn checkout svn://10.1.1.1/home/myrepos myrepos
四、容易出現的問題
在訪問svnserve時,遇到了不少的問題,大致總結一下:
1. 這一步最容易避免,一定要記得啟動svnserve。
2. 記得要正確的修改配置文件svnserve.conf和passwd。
3. 保證版本庫伺服器沒有配置限制遠程訪問svnserve的規則。有時在訪問svn伺服器的時候,會提示伺服器積極拒絕鏈接。簡單起見,可以看看iptables -L INPUT和iptables -L OUTPUT有沒有限制訪問的規則。
4. 要保證輸入版本庫的URL正確。
後記:
1. 版本庫的初次導入可以採用多種方式:
(1)直接構建好版本庫目錄,並將源碼拷貝的對應的位置,然後svn import即可;
(2)先用svn checkout取出版本,然後構建目錄和源碼,執行svn add 並且svn commit即可。
2. 導入或者提交文件類型的控制
svn客戶端是可以配置忽略哪些些文件,比如說我們不想提交*.o之類的文件。那麼可以通過設置svn:ignore或者global-ignore來進行過濾相關的文件。通常默認的情況就會過濾掉*.o, *.so,*.a等被svn認為是中間生成的文件。我本人使用的客服端不管是WIN的還是Linux的都是這種默認情況。
但是,如果有時基於某種需要,或者是導入一個別人之前維護的工程,裡面有些*.so,*.a文件必須保留,那麼如果在第一次import的時候全部導入呢?曾經問過有些朋友說,svn add或者svn import是可以直接把這種文件導入到版本庫的。但是我個人進行測試的時候,確實導入不進去,除非你直接svn add這個文件,然後提交應該就可以了。
如果這樣的文件比較多,而且比較分散,那麼如何解決呢?看一下svn import和svn add這兩個命令的幫助,都有--no-ignore選項。這個選項的功能就是執行相應動作的時候,不忽略任何文件。那麼執行以下兩條命令:
svn import [source] [repository] --no-ignore
或
svn add [source] --no-ignore
會自動將source目錄下所有的內容全部import或者add。
因此,通過--no-ignore選項,可以滿足提交一些特殊文件的需求。
3. 用一個舊版本的svnadmin創建的版本庫,直接拷貝到另外一台svn版本比較高的PC上使用時,發現提示資料庫版本不匹配。解決的方法:
(1)導出舊的版本庫內容,包含版本信息
具體使用的命令為svnadmin mp, 詳細使用方法參考手冊。該命令的格式為:
svnadmin mp REPOS_PATH [-r LOWER[:UPPER]] [--incremental]
如果我將版本庫完整的信息都倒出來的話,執行如下命令:
# svnadmin mp old_repos > repos.mp
默認版本庫mp的時候是輸出在終端的,通過重定下輸出到repos.mp文件裡面。該文件實際是文本文件。
(2)導入舊版本庫的內容
在需要導入的位置,新建一個版本庫
# svnadmin create new_repos
然後將repos.mp文件導入到新的版本庫:
# svnadmin load new_repos < repos.mp
② Windows與Linux下SVN怎樣使用
Windows與Linux下SVN怎樣使用?
本文分2個部分(包括Windows與Linux操作系統平台),第1部分:怎樣安裝 第2部分:怎樣使用
-----------------------------------------第1部分:怎樣安裝-----------------------------------------
怎樣安裝分2種情況,第1種:在公司上班 第2種:在宿舍電腦
--------------------第1種:在公司上班--------------------
說明:通常SVN伺服器是安裝在windows上的,安裝好後,客戶端2種平台都能使用
Windows平台下
服務端與客戶端:
通常這種情況,你想安裝,公司都不會讓你安裝,一般是由公司內網管專業人士統一安裝好,並給你分配好賬戶與密碼,以及每個SVN下使用許可權,所以這種情況你可以不用去管怎樣安裝了,只管怎樣使用即可
linux平台下
服務端:即windows上的服務端
客戶端:如果你在本機安裝的Linux虛擬機,通常是自己安裝的,不是公司網管安裝的,安裝辦法如下:
1步即能安裝:在linux下輸入命令 sudo apt-get install subversion
即SVN,安裝後同windows上SVN一樣,只不過這里是輸入命令而已
--------------------第2種:在宿舍電腦--------------------
Windows與Linux平台下
說實在的,宿舍就1台電腦.本來電腦就垃圾.而且還開著虛擬機,在開2個VS2010,就已經卡的要死.在來個SVN,估計會慢如蝸牛,其實大部分程序員也是只有一台電腦,安裝SVN真的沒必要.除非有多台電腦.SVN本質是為方便團隊開發
-----------------------------------------第2部分:怎樣使用-----------------------------------------
怎樣使用要分2種情況,第1種:是Windows平台 第2種:是Linux平台
--------------------第1種:是Windows平台--------------------
1.更新
右鍵->SVN更新
2.提交(也可說成是上傳)
第1步:進入要提交的SVN文件目錄裡面,導入文件
第2步:導入後,返回上一層目錄,即返回到要提交的SVN文件目錄,右鍵點擊此SVN目錄,彈出,提交,進入
第3步:進入提交對話框後,會顯示2個編輯框,上面的編輯框是確認要提交的內容,下面的編輯框是你剛導入的文件內容,
你現在若是想提交剛才導入的內容,就把下面編輯框的內容用滑鼠拖動到上面的編輯框,並按確定
若不想提交剛才導入的內容,直接按取消退出即可
3.導出
即怎樣去掉SVN的專用標志,有的是對勾,有的是?號等等?
方法 1:在文件屬性--->選擇顯示所有文件,這時文件里會出現1個.svn的文件目錄,把它刪掉即可.(文件目錄多時,不推薦)
方法 2:在SVN右鍵--->導出,這時導出的文件不會帶SVN標志了
4.刪除
在SVN右鍵中,刪除之後.要返回上一層目錄,點提交.
刪除信息在變更列表,要拖動到信息欄下,然後點確定
5.保存認證
每當電腦密碼更改時,SVN以前保存的密碼也會要更新,此時會彈出一個認證框,重新輸入賬號與新密碼,在保存認證處打勾即可
--------------------第2種:是Linux平台--------------------
1.更新
命令:svn update
2.提交(也可說成是上傳)
第1步:進入要提交的SVN文件目錄裡面,
第2步:添加要提交的目錄用svn add *----------->注:(*代表添加文件、目錄或符號鏈)
第3步:提交
(1)提交全部
svn ci -m"*"----------->m表示寫注釋,*代表注釋內容
注:在LINUX上同一目錄存在其它文件,svn ci提交時,只會提交SVN伺服器已有的文件.如果想讓同一目錄下的其它文件也提交到SVN伺服器,可以先通過svn add先添加此文件或文件夾等
(2)提交單個
svn ci -m"add select_area packet" Gateway_Handler.cpp
後面一個加上要提交的文件(記的把後綴名寫上去).
提交成功後會提示
Sending Gateway_Handler.cpp
Transmitting file data .
Committed revision 242.
3.保存認證
每當電腦密碼更改時,SVN以前保存的密碼也會要更新,此時會顯示要輸入密碼,重新輸入賬號與新密碼,最後會提示是否要保存密碼(yes/no),選yes即可
4.下載
命令 svn co * (*代表下載地址,例如http://192.168.1.101/project/servers/command)
之後會在當前目錄下,導出一個command文件夾,裡面是SVN伺服器上的文件
5.刪除
svn del *(*為文件名,或文件)
6.查看修改後的操作是哪些
svn diff
---------------------------------------------------以下是摘抄的---------------------------------------------------
1、將文件checkout到本地目錄
svn checkout path(path是伺服器上的目錄)
例如:svn checkout svn://192.168.1.1/pro/domain
簡寫:svn co
1、將文件checkout到本地目錄
svn checkout path(path是伺服器上的目錄)
例如:svn checkout svn://192.168.1.1/pro/domain
簡寫:svn co
2、往版本庫中添加新的文件
svn add file
例如:svn add test.php(添加test.php)
svn add *.php(添加當前目錄下所有的php文件)
3、將改動的文件提交到版本庫
svn commit -m 「LogMessage「 [-N] [--no-unlock] PATH(如果選擇了保持鎖,就使用–no-unlock開關)
例如:svn commit -m 「add test file for my test「 test.php
簡寫:svn ci
4、加鎖/解鎖
svn lock -m 「LockMessage「 [--force] PATH
例如:svn lock -m 「lock test file「 test.php
svn unlock PATH
5、更新到某個版本
svn update -r m path
例如:
svn update如果後面沒有目錄,默認將當前目錄以及子目錄下的所有文件都更新到最新版本。
svn update -r 200 test.php(將版本庫中的文件test.php還原到版本200)
svn update test.php(更新,於版本庫同步。如果在提交的時候提示過期的話,是因為沖突,需要先update,修改文件,然後清除svn resolved,最後再提交commit)
簡寫:svn up
6、查看文件或者目錄狀態
1)svn status path(目錄下的文件和子目錄的狀態,正常狀態不顯示)
【?:不在svn的控制中;M:內容被修改;C:發生沖突;A:預定加入到版本庫;K:被鎖定】
2)svn status -v path(顯示文件和子目錄狀態)
第一列保持相同,第二列顯示工作版本號,第三和第四列顯示最後一次修改的版本號和修改人。
註:svn status、svn diff和 svn revert這三條命令在沒有網路的情況下也可以執行的,原因是svn在本地的.svn中保留了本地版本的原始拷貝。
簡寫:svn st
7、刪除文件
svn delete path -m 「delete test fle「
例如:svn delete svn://192.168.1.1/pro/domain/test.php -m 「delete test file」
或者直接svn delete test.php 然後再svn ci -m 『delete test file『,推薦使用這種
簡寫:svn (del, remove, rm)
8、查看日誌
svn log path
例如:svn log test.php 顯示這個文件的所有修改記錄,及其版本號的變化
9、查看文件詳細信息
svn info path
例如:svn info test.php
10、比較差異
svn diff path(將修改的文件與基礎版本比較)
例如:svn diff test.php
svn diff -r m:n path(對版本m和版本n比較差異)
例如:svn diff -r 200:201 test.php
簡寫:svn di
11、將兩個版本之間的差異合並到當前文件
svn merge -r m:n path
例如:svn merge -r 200:205 test.php(將版本200與205之間的差異合並到當前文件,但是一般都會產生沖突,需要處理一下)
12、SVN 幫助
svn help
svn help ci
——————————————————————————
以上是常用命令,下面寫幾個不經常用的
——————————————————————————
13、版本庫下的文件和目錄列表
svn list path
顯示path目錄下的所有屬於版本庫的文件和目錄
簡寫:svn ls
14、創建納入版本控制下的新目錄
svn mkdir: 創建納入版本控制下的新目錄。
用法: 1、mkdir PATH…
2、mkdir URL…
創建版本控制的目錄。
1、每一個以工作副本 PATH 指定的目錄,都會創建在本地端,並且加入新增
調度,以待下一次的提交。
2、每個以URL指定的目錄,都會透過立即提交於倉庫中創建。
在這兩個情況下,所有的中間目錄都必須事先存在。
15、恢復本地修改
svn revert: 恢復原始未改變的工作副本文件 (恢復大部份的本地修改)。revert:
用法: revert PATH…
注意: 本子命令不會存取網路,並且會解除沖突的狀況。但是它不會恢復
被刪除的目錄
16、代碼庫URL變更
svn switch (sw): 更新工作副本至不同的URL。
用法: 1、switch URL [PATH]
2、switch –relocate FROM TO [PATH...]
1、更新你的工作副本,映射到一個新的URL,其行為跟「svn update」很像,也會將
伺服器上文件與本地文件合並。這是將工作副本對應到同一倉庫中某個分支或者標記的
方法。
2、改寫工作副本的URL元數據,以反映單純的URL上的改變。當倉庫的根URL變動
(比如方案名或是主機名稱變動),但是工作副本仍舊對映到同一倉庫的同一目錄時使用
這個命令更新工作副本與倉庫的對應關系。
17、解決沖突
svn resolved: 移除工作副本的目錄或文件的「沖突」狀態。
用法: resolved PATH…
注意: 本子命令不會依語法來解決沖突或是移除沖突標記;它只是移除沖突的
相關文件,然後讓 PATH 可以再次提交。
18、輸出指定文件或URL的內容。
svn cat 目標[@版本]…如果指定了版本,將從指定的版本開始查找。
svn cat -r PREV filename > filename (PREV 是上一版本,也可以寫具體版本號,這樣輸出結果是可以提交的)
19、查找工作拷貝中的所有遺留的日誌文件,刪除進程中的鎖。
當Subversion改變你的工作拷貝(或是.svn中的任何信息),它會盡可能的小心,在修改任何事情之前,它把意圖寫到日誌文件中去,然後執行log文件中的命令,然後刪掉日誌文件,這與分類帳的文件系統架構類似。如果Subversion的操作中斷了(舉個例子:進程被殺死了,機器死掉了),日誌文件會保存在硬碟上,通過重新執行日誌文件,Subversion可以完成上一次開始的操作,你的工作拷貝可以回到一致的狀態。
這就是svn cleanup所作的:它查找工作拷貝中的所有遺留的日誌文件,刪除進程中的鎖。如果Subversion告訴你工作拷貝中的一部分已經「鎖定」了,你就需要運行這個命令了。同樣,svn status將會使用L 顯示鎖定的項目:
$ svn status L somedirM somedir/foo.c $ svn cleanup$ svn statusM somedir/foo.c20、拷貝用戶的一個未被版本化的目錄樹到版本庫。svn import命令是拷貝用戶的一個未被版本化的目錄樹到版本庫最快的方法,如果需要,它也要建立一些中介文件。
$ svnadmin create /usr/local/svn/newrepos $ svn import mytree file:///usr/local/svn/newrepos/some/project Adding mytree/foo.c Adding mytree/bar.c Adding mytree/subdir Adding mytree/subdir/quux.h Committed revision 1.
在上一個例子里,將會拷貝目錄mytree到版本庫的some/project下:
$ svn list file:///usr/local/svn/newrepos/some/project bar.c foo.c subdir/
注意,在導入之後,原來的目錄樹並沒有轉化成工作拷貝,為了開始工作,你還是需要運行svn checkout導出一個工作拷貝。
另附:為SVN加入Email通知
可以通過Subversion的Hook腳本的方式為SVN加入郵件列表功能
編譯安裝了Subversion後 在源碼的tools 下有一個comm-email.pl的Perl腳本,在你的檔案目錄下有一個hooks目錄,進入到hooks目錄把post-commit.tmpl 改名為post-commit並給它可執行的許可權。
更改post-commit腳本 把comm-email.pl腳本的決對路徑加上,否則 SVN找不到comm-email.pl
REPOS="$1"
REV="$2"
/usr/local/svn/resp/commit-email.pl "$REPOS" "$REV" [email protected] [email protected]
#log-commit.py --repository "$REPOS" --revision "$REV"
最後一行是用來記日誌的 我不用這個功能 所以注釋掉了.
-------------------------------------------------------------------------------------------------------
注意:為保證代碼安全.最好要備份.每個操作都要謹慎
③ linux配置SVN,添加用戶,配置用戶組的許可權
用xshell登陸伺服器,cd切換到伺服器中svn的項目倉庫目錄中,然後切換到conf文件中(也可使用xftp),會看到3個文件,分別是
authz、passwd、svnserve.conf
首先編輯svnserve.conf主配置文件,主要是對以下幾項修改
如果後面大家要用到組許可權的話,大家看authz-db = authz 前面應該會有 # 號鍵,記得去掉,這樣才能在下面分配組許可權的時候,才能起作用。
建立svn用戶以及密碼:
配置組:
配置各個組許可權:
保存修改後的svnserve.conf ,passwd,authz 三個文件
然後用下面的命令重啟一下svn
查看svn進程:ps -ef | grep svn 或者 ps aux | grep svn
強制殺死進程:kill -9 進程號
重啟svn(/home/svn為自己的目錄地址):svnserve -d -r /home/svn
最後看看是不是成功了,可以在本地測試一下,看看賬戶是否可用,對應的許可權是不是已經有了,不是該組的用戶應該不能訪問沒有賦予許可權的目錄的
helloword倉庫:
現在對於def項目中,我不想讓產品部的人看到開發部和數據部的目錄下面的數據怎麼辦?可以通過 = 來設置,沒有設置許可權的人統統不能訪問, = 這一句的目的,就是割斷許可權繼承性,使得管理員可以定製某個目錄及其子目錄的許可權,從而完全避開其父目錄許可權設置的影響
④ linux 已經安裝svn 怎麼配置
代碼庫創建
SVN軟體安裝完成後還需要建立SVN庫
[root@Linux moles]# mkdir -p /opt/svn/repo
[root@Linux moles]# svnadmin create /opt/svn/repo
執行上面的命令後,自動建立repo測試庫,查看/opt/svn/repo 文件夾發現包含了conf, db,format,hooks, locks, README.txt等文件,說明一個SVN庫已經建立。
配置SVN代碼庫
進入上面生成的文件夾conf下,進行配置
[root@Linux moles]# cd /opt/svn/repo/conf
用戶密碼passwd配置
[root@Linux password]# cd /opt/svn/repos/conf
[root@Linux conf]# vim passwd
修改passwd為以下內容:
[users]
# harry = harryssecret
# sally = sallyssecret
root=raykaeso
用戶名=密碼
這樣我們就建立了root用戶, raykaeso密碼
以上語句都必須頂格寫, 左側不能留空格, 否則會出錯.
許可權控制authz配置
[root@Linux conf]# vi + authz
目的是設置哪些用戶可以訪問哪些目錄,向authz文件追加以下內容:
#設置[/]代表根目錄下所有的資源
[/] 或者寫成[repl:/]
root= rw
意思是root用戶對repo測試庫下所有的目錄有讀寫許可權,當然也可以限定。
如果是自己用,就直接是讀寫吧。
以上語句都必須頂格寫, 左側不能留空格, 否則會出錯.
服務svnserve.conf配置
[root@Linux conf]# vim svnserve.conf
追加以下內容:
[general]
#匿名訪問的許可權,可以是read,write,none,默認為read
anon-access=none
#使授權用戶有寫許可權
auth-access=write
#密碼資料庫的路徑
password-db=passwd
#訪問控制文件
authz-db=authz
#認證命名空間,subversion會在認證提示里顯示,並且作為憑證緩存的關鍵字
realm=/opt/svn/repositories
以上語句都必須頂格寫, 左側不能留空格, 否則會出錯.
配置防火牆,SVN埠為3690
[root@Linux conf]# vi /etc/sysconfig/iptables
添加以下內容:
-A INPUT -m state –state NEW -m tcp -p tcp –dport 3690 -j ACCEPT
保存後重啟防火牆
[root@Linux conf]# service iptables restart
啟動SVN
svnserve -d -r /opt/svn/repo
啟動SVN服務
svnserve -d -r /opt/svn/
注意:如果在一台伺服器上同時啟動多個版本管理,那麼啟動路徑必須是所有項目倉庫的根路徑:比如
/opt/svn/project1 /opt/svn/project2 ——————-> /opt/svn/
參考:CentOS 6.2 SVN搭建 (YUM安裝)-http://www.leixuesong.cn/226