<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    小石頭
    Excellence in any department can be attained only by the labor of a lifetime; it is not to be purchased at a lesser price.
    posts - 91,comments - 22,trackbacks - 0
    Subversion 系統

    多年來,并發版本系統(CVS)一直是在Linux上管理代碼或者文本的標準。作為基于RCS上建立但卻允許多用戶協作的系統而言,CVS記錄所有文件的修改信息。這對于程序開發者、網絡設計者和系統管理員而言,是非常有用的。
    然而,CVS逐漸顯示出它的衰老,出現了相似的源代碼管理軟件。然而大多這種東西都是以牟利為主要目的的。
    Subversion就是一種相對新鮮的源代碼管理系統。雖然事實上它還在不斷的反展之中,但是Subversion已經是一個非常穩定而且成熟的產品。它是一個全新的系統,其功能可以和CVS媲美,同時,它要比CVS更直觀,更容易操作。本文就Subversion的安裝和一些特殊功能作一個介紹。
    安裝服務器端

    下載Apache和SVN源碼包
    從官方網站臺下載httpd-2.0.52.tar.gz,subversion-1.1.1.tar.gz
    (因為redhat 9默認安裝的Apache沒有并包含--enable-so選項,所以無法產生mod_dav_svn.沒有這個模塊,SVN就無法采用http方式運行,所以必須重新編譯新的Apache)
    以root身份執行:
    #tar zxvf httpd-2.0.52.tar.gz
    #cd httpd-2.0.52
    #./configure --enable-dav --enable-so --enable-maintainer-mode
    #make
    #make install
    此時會產生/usr/local/apache2目錄,接著執行:
    #tar zxvf subversion-1.1.1.tar.gz
    #./configure --with-apxs=/usr/local/apache2/bin/apxs
    # rm /usr/local/lib/libsvn*
    # make clean && make && make install

    此時會自動在/usr/local/apache2/conf/httpd.conf添加
    LoadModule dav_svn_module ?modules/mod_dav_svn.so
    安裝完成后,運行svnserver --version確認版本為1.1.1。
    SVN服務器安裝結束.

    安裝客戶機端

    window客戶機:
    直接安裝TortoiseSVN-1.1.1-UNICODE_svn-1.1.1.msi,方法同一般軟件安裝相同。
    Linux客戶機:
    方法輿安裝服務器相同。
    (注意redhat 9默認安裝的SVN版本為0.17.1,它的客戶端命令svn無法輿新的SVN服務器通訊,必須重新安裝)

    建立倉庫Repository

    Subversion 的檔案庫是個中央倉儲, 用來存放任意數量項目的受版本控管資料,建立方法很簡單
    #svnadmin create path/to/repos
    舉個例子:
    #svnadmin create /home/mysvn
    #chown –R nobody /home/mysvn
    運行服務器

    Subversion服務器有兩種運行方式,一是可以作為Apache 2.0的一個模塊, 以WebDAV/DeltaV協議與外界連通;另外,也可使用Subversion 自帶的小型服務器程序svnserve。該程序使用的是自帶的通訊協議,可以很容易地透過SSH以
    以http方式運行
    在/usr/local/apache2/conf/httpd.conf中加入:
    <Location /svn/repository>
    ?DAV svn
    ?SVNPath /home/mysvn
    </Location>
    在服務器的瀏覽器中輸入網址:
    http://localhost/svn/repository/
    這時候,你會看到這樣的顯示:

    這表明服務器已經以http方式正常運行了.
    以svnserve方式運行
    這種方式的運行又可以分為以下兩種(這和vsftp有些相似)
    1) standalone mode
    直接運行 #svnserve –d
    運行 lsof -i :3690可以看到SVN服務器已經在運行
    2) xinetd mode
    在/etc/xinetd.d/下生成svnserve文件,內容如下
    service svnserve
    {
    disable = no
    socket_type ? ? ? ? ? ? = stream
    protocol ? ? ? ? ? ? ? ? = tcp
    wait ? ? ? ? ? ? ? ? ? ?= no
    user ? ? ? ? ? ? ? ? ? ?= apache
    server ? ? ? ? ? ? ? ? ?= /usr/local/bin/svnserve
    server_args ? ? ? ? ? ? = -i
    }
    編輯 /etc/services 檔,加入底下兩行:
    svnserve ? ? ? ?3690/tcp ? ? ? ? ? ? ? ? ? ? ? ?# Subversion svnserve
    svnserve ? ? ? ?3690/udp ? ? ? ? ? ? ? ? ? ? ? ?# Subversion svnserve
    重啟xinetd服務,運行 lsof -i :3690可以看到SVN服務器已經在運行

    客戶機訪問

    客戶機的訪問方法輿服務器的運行方式有直接關系
    window客戶機:
    1) 服務器以http方式運行
    安裝完TortoiseSVN-1.1.1-UNICODE_svn-1.1.1.msi后,在你想工作的目錄下點擊右鍵,執行checkout,按上圖輸入即可。

    2) 服務器以svnserve方式運行
    同上的區別只是URL of repository變為 svn://svn服務器ip/home/mysvn
    或者 svn+ssh://svn服務器ip/home/mysvn
    (注意不是//svn服務器ip//svn/repository)
    linux客戶機:
    1) 服務器以http方式運行
    執行 #svn checkout http: //svn服務器ip/svn/repository
    2) 服務器以svnserve方式運行
    執行 #svn checkout svn://svn服務器ip/home/mysvn
    或者 #svn checkout svn+ssh://svn服務器ip/home/mysvn

    客戶認證機制

    這輿服務器的運行方式有關
    服務器以http方式運行
    比如我們想給 Sally 與 Harry 送交存取檔案庫的權限. 首先, 我們必須把它們加入到密碼檔案.
    # ### 第一次: 以 -c 建立檔案
    # htpasswd -c /etc/svn-auth-file harry
    New password: *****
    Re-type new password: *****
    Adding password for user harry
    # htpasswd /etc/svn-auth-file sally
    New password: *******
    Re-type new password: *******
    Adding password for user sally
    #
    接著,在/usr/local/apache2/conf/httpd.conf的加入:
    <Location /svn/repository >
    ?DAV svn
    ?SVNPath /home/mycvs
    ?AuthType Basic
    ?AuthName "Subversion repository"
    ?AuthUserFile /etc/svn-auth-file
    Require valid-user
    </Location>
    重新激活 Apache后,如果有人要訪問SVN服務器,系統會要求他輸入用戶名和密碼。 只有輸入Sally 或Harry的用戶名和相應的密碼,才可以對檔案庫進行修改和訪問

    服務器以svnserve方式運行
    默認下客戶可以以匿名方式通過svn://方式任意訪問檔案庫,為了限制其權限,比如只允許讀操作,可以通過修改檔案庫conf子目錄中的svnseve.conf文件來實現。
    #vi /home/mysvn/conf/svnseve.conf
    修改[general]字段下內容為:
    anon-access = read
    如果設為anon-access = none,則匿名用戶不可以通過svn://方式訪問檔案庫
    為了實現用戶認證,我們一般采用svn+ssh://訪問機制。
    首先在svnseve.conf文件設置anon-access = none禁止匿名用戶通過svn://方式訪問檔案庫,然后在其后加入
    auth-access = write
    auth-access 是限制有援權的使用者(使用svn+ssh:// 來登入) 的存取權限,我們設為是可以讀寫。
    當用戶通過svn+ssh://訪問時,服務器會自動激活ssh認證機制,要求用戶輸入密碼,對于window用戶來說還需要安裝第三方軟件openssh,才可以采用這種機制
    Hook scripts
    掛勾 (hook) 是改動檔案庫時所觸發的程序, 比如當你提交更動前,會先觸發pre-commit,提交更動后,則會觸發post-commit,我們可以利用hook來實現一些自動控制。檔案庫的hook 子目錄中, 預設是放置各個檔案庫掛勾的模板:
    post-commit.tmpl ? ? ? ? ?
    pre-revprop-change.tmpl
    post-revprop-change.tmpl ?
    start-commit.tmpl
    pre-commit.tmpl ? ? ? ?
    如果要使用這些hook,就必須把它的后綴名.tmpl去掉,拷貝為
    post-commit ? ? ? ? ?
    pre-revprop-change
    post-revprop-change ?
    start-commit
    pre-commit
    這里主要介紹pre-commit和post-commit(事實上它們就是在特定的情況下被觸發的普通的shell程序,至于shell的內容由用戶自己隨意編寫,但是要保證名稱不能改動)
    pre-commit
    本掛勾執行的時間為異動完成之后, 送交之前.檔案庫會傳遞兩個自變量給這個程序: 檔案庫的路徑, 以及準備送交的異動名稱. 如果程序傳回一個非零的結束值, 送交會被中止, 而異動會被刪除.

    如何應用pre-commit我們不妨舉個例子:
    假如有一個項目由Mail Team,Login Team和PHP Team三個Team共同通過SVN系統開發完成。當項目準備發布的時候,PM人員發現Mail功能方面存在一些 bug,需要Mail Team去修改,為了防止其它Team的人員修改系統,我們可以在任何改動檔案庫的企圖之前用pre-commit去檢查log message信息,(因為任何更動檔案庫的操作都必須提供log message信息,PM可以事先輿Mail Team約定好一個log message),如果輿pre-commit中設定的log message不相符,則不能提交更動。
    pre-commit源程序如下:
    #!/bin/sh
    REPOS="$1"
    TXN="$2"
    SVNLOOK=/usr/local/bin/svnlook
    $SVNLOOK log -t "$TXN" "$REPOS" | \
    ? grep –w "bug1234" > /dev/null || exit 1
    exit 0
    本例中的log message為”bug1234”,任何人想要提交更動就必須用 –m “bug1234”參數,采用-m “bug123”,-m “bug12345”都會提交失敗。
    post-commit
    本掛勾執行的時間是在異動送交, 新修訂版被建立之后. 大多數的人用這個掛勾來寄出關于本次送交的電子郵件, 或是建立檔案庫的備份. 檔案庫會傳遞兩個自變量給這個程序: 檔案庫的路徑, 以及新建立的修訂版號. 本程序的結束碼會被忽略.

    Subversion 源碼樹的 tools/hook-script 目錄中包含了一個 commit-email.pl 命令,可以用來寄送包含描述指定送交的電子郵件. 這個郵件包含了更動路徑列表, 該送交所對應的記錄訊息, 使用者, 送交的日期,以及一個以 GNU diff 樣式表示的本次更動差異. 我們可以將這個程序輿post-commit這個hook搭配起來使用來實現檔案庫更動后自動mail給相關人員的功能。
    post-commit源程序如下:
    #!/bin/sh
    REPOS="$1"
    REV="$2"
    commit-email.pl "$REPOS" "$REV" PM@yourdomain.com
    ##需要指明commit-email.pl的絕對路徑

    特殊性質

    除了對你的目錄與檔案進行版本控制之外, Subversion 還提供了一個接口, 可用來新增, 修改, 以及移除已納入版本控制的目錄與檔案的版本控制描述資料. 我們稱這個描述資料為性質,在這里我主要介紹以下幾個比較重要的特殊性質
    svn:mime-type
    svn:mime-type 性質在 Subversion 中有很多作用. 除了作為儲存檔案的多用途網際網絡郵件延伸語法 (MIME) 分類之外, 這個性質的內容還會決定幾項 Subversion 的行為特征.
    舉個例子, 如果 svn:mime-type 性質設為文字的 MIME 類別 , Subversion 會假設該檔的內容是二進制(也就是人類看不懂的資料). Subversion 提供的功能中, 其中一項是在從服務器收到工作檔的更新中, 依文字內容與文字列進行合并. 但是對含有二進制資料的檔案, 根本就沒有 “文字列” 的概念. 因此, Subversion 對這些檔案在更新時, 不會試著進行內文合并. 它改用另一種方式。
    一般來說Subversion 在執行 svn import 與 svn add 子命令時, 會使用二進制偵測運算法的方式來協助使用者.但是如果 Subversion 猜錯了, 或是你希望將 svn:mime-type 設定成更為明確的值(可能是 image/png)你都可以移除或是手動編輯這個性質.
    svn:ignore
    svn:ignore 性質包含了檔案樣式的列表, Subversion 處理時會忽略. 它可以與執行時期設定的 global-ignores 選項一起工作, 以便在類似 svn status 的命令中過濾掉未納入版本控制的目錄與檔案.
    我們知道新增的文件和目錄必須透過 svn add 命令, 才會被納入 Subversion 的管理. svn status 命令會將工作復本中未納入版控制目錄與檔案顯示出來.
    $ svn status calc
    M ? ? calc/button.c
    ? ? ? ?calc/calculator
    ? ? ? ?calc/data.c
    ? ? ? ?calc/debug_log
    ? ? ? ?calc/debug_log.1

    在這個范例中, 用?標注出來的文件就是未納入版控制的檔案.如果你不想每次執行 svn status 時, 都看到這些檔案, 那幺svn:ignore 性質就是解決方案。你可以透過 svn propedit svn:ignore calc 對 calc 目錄加上一些忽略樣式. 舉個例子,將以下的值作為 svn:ignore 性質的新內容:
    calculator
    debug_log*
    加上這個性質后再執行你的 svn status 輸出便會不同:
    $ svn status
    M ? ? calc
    M ? ? calc/button.c
    ? ? ? ?calc/data.c
    現在, 所有不想看到的東西都從輸出中消失了!


    svn:keywords
    Subversion 具有取代關鍵詞(有關納入版本控制檔案的有用信息)進入檔案內容的功能.
    舉個例子, 假設你有個文件, 想要在里面顯示最近一次修改的日期. 你可以把這個負擔加諸文件的作者身上, 讓他們每一次送交更動之前, 順便添加最近一次修改日期的部份. 但是遲早有人會忘記這件事. 換個方式, 只要叫 Subversion 對 LastChangedDate 關鍵詞進行關鍵詞取代即可.
    Subversion 定義了可用來進行取代的關鍵詞列表. 這個列表包含了以下五個關鍵詞:
    LastChangedDate
    LastChangedRevision
    LastChangedBy
    HeadURL
    Id
    如果只把關鍵詞定位錨加進檔案里的話, 什幺事也不會發生.要告訴 Subversion 是否該對某一個檔案進行關鍵詞取代,得使用svn:keywords這個性質。當它被設定時, 它會控制該檔案哪個關鍵詞應該被取代.
    舉個例子, 假設你有一個納入版本控制的檔案, 名為 weather.txt, 看起來像這樣:
    Here is the latest report from the front lines.
    $LastChangedDate$
    $Rev$
    Cumulus clouds are appearing more frequently as summer approaches.
    如果沒有設定該檔案的 svn:keywords 性質, Subversion 什幺事也不會作. 讓我們開啟關鍵詞 LastChangedDate 的內容取代.
    $ svn propset svn:keywords "LastChangedDate Author" weather.txt
    property `svn:keywords' set on 'weather.txt'
    $
    在你送交了這個性質更動之后, Subversion 會顯示為:
    Here is the latest report from the front lines.
    $LastChangedDate: 2002-07-22 21:42:37 -0700 (Mon, 22 Jul 2002) $
    $Rev$
    Cumulus clouds are appearing more frequently as summer approaches.
    這樣不管誰提交這個文件,都會在里面顯示最近一次修改的日期。
    svn:eol-style
    除非另外指定版本控制檔案的 svn:mime-type 性質, Subversion 會假設檔案包含人類可讀的資料.這對于列尾符號 (EOL) 是很不幸地, 因為不同的操作系統會使用不同的符號來表示一列的結尾. 舉個例子, 一般用在 Windows 平臺上的列尾符號是兩個 ASCII 控制字符 :返回字符 (CR) 與換行字符 (LF). 但是 Unix 軟件就只使用 LF 字符來表示一列的結尾.這樣以來window客戶提交的檔案中的CR 字符在 linux客戶端會顯示成 ^M, 而linux客戶提交的檔案中CR 字符在 Windows 客戶端會被忽略。結果將檔案里的所有文字列合并成一個超長的文字列, 這是因為沒有返回CRLF字符組合的存在來表示一個換行。 解決的方法是 svn:eol-style 性質. 當這個性質設定為native時, Subversion 會根據系統的類型來決定是否對該檔案的結尾進行自動處理。.
    svn:externals
    有的時候, 一個工作復本可能包含了數個不同來源的工作復本. 舉個例子, 你可能想要有數個不同的目錄, 各來自不同的檔案庫.我們可以通過svn:externals 性質來宣告這一對對應關系。內容是子目錄對應至 Subversion 檔案庫 URL 的多行表格.
    $ svn propget svn:externals calc
    third-party/sounds ? ? ? ? ?http://sounds.red-bean.com/repos
    third-party/skins ? ? ? ? ? http://skins.red-bean.com/repositories/skinproj
    third-party/skins/toolkit ? http://svn.red-bean.com/repos/skin-maker
    當有人取出 calc 目錄的工作復本, Subversion 還會繼續取出在外部定義里的項目.
    $ svn checkout http://svn.example.com/repos/calc
    A ?calc
    A ?calc/Makefile
    A ?calc/integer.c
    A ?calc/button.c
    Checked out revision 148.

    Fetching external item into calc/third-party/sounds
    A ?calc/third-party/sounds/ding.ogg
    A ?calc/third-party/sounds/dong.ogg
    A ?calc/third-party/sounds/clang.ogg
    Checked out revision 14.

    Fetching external item into calc/third-party/skins


    小結

    Subversion有一份很好的文檔——《Version Control with Subversion》(http://svnbook.red-bean.com/)。它提供了有關Subversion的各方面內容,如使用、管理和開發等。
    經過數年的開發,以替代CVS為目標的Subversion,相信以其強大的功能,對CVS良好的繼承性,一定會有很好的發展
    posted on 2007-03-06 23:05 小石頭 閱讀(670) 評論(0)  編輯  收藏 所屬分類: Subversion
    主站蜘蛛池模板: 久久精品国产精品亚洲人人| 精品亚洲456在线播放| 免费无码黄网站在线看| 亚洲天堂一区在线| 国产成人精品日本亚洲网站| 好吊妞998视频免费观看在线| a在线观看免费视频| 99久在线国内在线播放免费观看| 一级**爱片免费视频| 亚洲一区二区无码偷拍| 亚洲一区在线视频| 久久久久亚洲AV无码麻豆| 亚洲乱码国产一区网址| 国产成人精品123区免费视频| 成年在线观看网站免费| 67pao强力打造高清免费| 天堂在线免费观看| 久久久久久国产a免费观看不卡| 国产精品亚洲а∨无码播放不卡| 亚洲国产成人九九综合| 亚洲一区二区三区深夜天堂| 美女免费精品高清毛片在线视| 亚洲av最新在线观看网址| 国产日本亚洲一区二区三区| 久久亚洲精品国产精品婷婷| 久久免费香蕉视频| 永久免费AV无码网站在线观看| 午夜一级毛片免费视频| 亚洲成a人片在线观看无码专区| 中文字幕在线观看亚洲日韩| 久久免费国产精品一区二区| 热re99久久6国产精品免费| 国产成人免费ā片在线观看| 久久精品a亚洲国产v高清不卡| 一级a性色生活片久久无少妇一级婬片免费放| 黄色片网站在线免费观看| 亚洲人成免费电影| 麻豆国产VA免费精品高清在线| 日产亚洲一区二区三区| 日韩大片在线永久免费观看网站 | 欧洲亚洲国产清在高|