精品伊人久久大香线蕉,开心久久婷婷综合中文字幕,杏田冲梨,人妻无码aⅴ不卡中文字幕

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
Learning Subversion

學習Subversion

-- 主流版本管理系統的使用和管理

作者:Zoom.Quiet

1. 概述

本文包含了創建和使用Subversion 進行軟件開發的基本知識,為有志于使用Subversion 這一方便的版本管理工具來支持規范化團隊軟件開發的程序員,在進行分布式協同開發時,如何組織版本控制提供了基礎的建議和實用技巧;

2. 簡介

Subversion:
  • 簡稱SVN 是 http://subversion.tigris.org/ 社區開發的,一個流行的用以代替CVS 的高效版本管理系統;和CVS 類似,也是一種"中央倉庫式"的版本管理系統;不過,和CVS 相比 SVN 具有很多高級特性;
  • 詳細的信息,可以參考在線的 SVNBookv1.4

3. 安裝SVN

當前最新版本是 1.5.5, SVN支持在各種操作系統中運行,安裝前請從官方網站下載對應版本; 本文將以 Ubuntu 系統為例進行說明.

3.1. 環境準備

一個 7.04 以上版本的Ubuntu 環境,有root 權限即可;

3.2. 安裝測試

因為SVN 已經包含在 Ubuntu 軟件倉庫中,安裝SVN 僅需一個命令:

$ sudo apt-get install subversion

 

如果系統報告了依賴關系的錯誤,請找出相應的軟件包并安裝它們。如果存在其它問題,也請自行解決。如果您是再不能解決這些問題,可以考慮通過 Ubuntu 的網站、Wiki、論壇或郵件列表尋求支持。

3.3. 運營發布

SVN 可以提供多種協議的訪問渠道,以下是模式列表:

模式 訪問方法
file:/// 直接訪問本地硬盤上文件倉庫
http:// 通過 WebDAV 協議訪問支持 Subversion 的 Apache 2 Web 服務器
https:// 類似 http://,支持 SSL 加密
svn:// 通過自帶協議訪問 svnserve 服務器
svn+ssh:// 類似 svn://,支持通過 SSH 通道
  • 其中svn:// 是本文介紹的模式;
  • 要想使用SVN,首先要初始化一個版本倉庫:
    $ svnadmin create /path/to/svn/myproj
        
  • 然后,運行`svnserve`
    $ svnserve -d -r /path/to/svn
        
    • 這樣,所有 `/path/to/svn` 目錄中的SVN倉庫都可以通過 svn:// 協議進行遠程訪問了
      # 本地訪問
              $ svn co svn://localhost/myproj
              # 遠程訪問
              $ svn co svn://host.example.org/myproj
              # 即刻下載,建立了本地工作復本,可以進行協同開發了
              

3.4. 在線免費SVN倉庫

事實上在網絡中有很多SVN的免費空間可以使用,其中 http://code.google.com/intl/zh/ 是一個較輕便卻完備的的項目管理環境,只要注冊成功一個項目空間,就同時獲得了一個維基,一個Issue ~ 提案追蹤環境,和一個SVN倉庫;

4. 管理SVN

SVN 本身提供了豐富的管理工具, 在系統配置方面,僅僅有少量文件用以聲明關鍵信息.

4.1. 關鍵配置

在倉庫目錄的 conf 目錄中 svnserve.conf 是關鍵配置文件:

...
[general]
# 聲明匿名用戶權限 read|write
anon-access = read
# 聲明登錄用戶權限 read|write
auth-access = write
# 聲明登錄用戶口令信息文件
password-db = passwd.cfg
# 聲明登錄用戶倉庫訪問權限
authz-db = authz.cfg
...

 

4.2. 權限配置

配合svnserve.conf 的聲明, SVN 通過理解兩個文件來對倉庫的訪問進行控制:

4.2.1. password-db

聲明的口令文件,定義了權限用戶和口令:

[users]
# 用戶名=口令 的格式來逐行聲明用戶賬號
woodpecker = 1q2w3e4r@woodpecker.org
...

 

4.2.2. authz-db

聲明的認證文件,定義了權限用戶組和倉庫不同部分的訪問控制:

[groups]
# 聲明用戶組 repomana 包含了幾個用戶
repomana = woodpecker,zoomq
# 倉庫目錄權限聲明 [倉庫名:目錄名] 格式引導多個權限聲明
[woodpecker:/]
# * 代表任何人
* = r
# repoman 組成員可以讀寫
@repomana = rw
[woodpecker:/foo]
# 任何人可寫
* = rw
# river 用戶只讀
river = r
...

 

5. 使用SVN

作為標準意義上的版本管理系統,SVN 和其它任何版本管理系統日常使用并沒有什么巨大的不同,是一個非常容易上手的工具系統;

5.1. 日常使用

以命令行形式說明日常通過SVN 進行協同開發時最常用的操作:

  1. 更新本地工作復本:
    • $ svn up
  2. 進行一些修訂:
    • $ svn add ~ 增補文件/目錄
    • $ svn del ~ 刪除文件/目錄
    • $ svn cp ~ 復制文件/目錄
    • $ svn mv ~ 移動文件/目錄
    • 以上命令隨時可以通過 --help 獲得充分的指示,例如:
       $ svn mv --help
              move (mv, rename, ren): 在工作副本或版本庫中移動或改名文件或目錄。
              用法: move SRC... DST
              當移動多個源時,它們作為 DST 的子節點增加,DST 必須是目錄。
              注意: 本子命令等同于先 “copy”,然后 “delete”。
              注意: 此命令中 --revision 選項沒有作用,已經淘汰。
              SRC 可同時為工作副本(WC) 路徑或 URL:
              WC  -> WC  :  移動并加入新增調度 (連同歷史記錄)
              URL -> URL :  完全是服務器端更名。
              所有 SRC 必須是同一類型。
              有效選項:
              -r [--revision] ARG      : ARG (一些命令也接受ARG1:ARG2范圍)
              版本參數可以是如下之一:
              NUMBER       版本號
              '{' DATE '}' 在指定時間以后的版本
              'HEAD'       版本庫中的最新版本
              'BASE'       工作副本的基線版本
              'COMMITTED'  最后提交或基線之前
              'PREV'       COMMITTED的前一版本
              -q [--quiet]             : 不打印信息,或只打印概要信息
              --force                  : 強制操作運行
              --parents                : 創建中間目錄
              -m [--message] ARG       : 指定日志信息ARG
              -F [--file] ARG          : 從文件ARG讀取日志信息
              --force-log              : 強制校驗日志信息資源
              --editor-cmd ARG         : 使用 ARG 作為外部編輯器
              --encoding ARG           : 將ARG的值視為字符編碼
              --with-revprop ARG       : 在新版本設置版本屬性 ARG
              使用格式 name[=value]
              

       

  3. 可能取消一些修改
    • $ svn revert
    • 詳細幫助:
      revert: 將工作副本文件恢復到原始版本(恢復大部份的本地修改)。
              用法: revert PATH...
              注意: 本子命令不會訪問網絡,它解除任何沖突的狀態。
              但是,它不恢復被刪除的目錄。
              有效選項:
              --targets ARG            : 傳遞文件 ARG 內容為附件參數
              -R [--recursive]         : 向下遞歸,與 --depth=infinity 相同
              --depth ARG              : 受深度參數 ARG(“empty”,“files”,“immediates”,或“infinity”) 約束的操作
              -q [--quiet]             : 不打印信息,或只打印概要信息
              --changelist ARG         : 只能對修改列表 ARG 成員操作
              [aliases: --cl]
              

       

  4. 可能解決一些沖突:
    • $ svn resolved
    • 詳細說明:
      resolved: 刪除工作副本中目錄或文件的“沖突”狀態。
              用法: resolved PATH...
              注意: 本子命令不會依語法來解決沖突或是刪除沖突標記;它只是刪除沖突相關的
              附加文件,讓 PATH 可以被再次提交。它已經過時,被
              “svn resolve --accept working”取代。
              有效選項:
              --targets ARG            : 傳遞文件 ARG 內容為附件參數
              -R [--recursive]         : 向下遞歸,與 --depth=infinity 相同
              --depth ARG              : 受深度參數 ARG(“empty”,“files”,“immediates”,或“infinity”) 約束的操作
              -q [--quiet]             : 不打印信息,或只打印概要信息
              
    • 可能的情景:
      $ svn up
              C  sandwich.txt
              Updated to revision 2.
              $ ls -1
              sandwich.txt
              sandwich.txt.mine
              sandwich.txt.r1
              sandwich.txt.r2
              
      • 在這種情況下,SVN不會允許你提交sandwich.txt,直到你解決沖突,可選的處置是:
        1. “手動”合并沖突文本(檢查和修改文件中的沖突標志)
        2. 運行svn revert <filename>來放棄所有的本地修改
        3. 用某一個版本的 臨時文件覆蓋你的工作文件
          • <filename>.r* 代表的是文件的第幾個版本
          • <filename>.mine 代表的是本地我的文件版本
          • <filename> 是包含沖突標識的提示文件

             

  5. 提交修改:
    • $ svn ci -m "提交理由"

       

      然后,就是以上過程的不斷循環

5.1.1. 對于 CVS 用戶

特別的,對于從CVS系統遷移過來的用戶,需要提升一些關鍵概念,來更好的使用 SVN:

  1. 版本號不同了
    • 在CVS中,修訂版本號是每文件的,這是因為CVS使用RCS文件保存數據,每個文件都在版本庫有一個對應的RCS文件,版本庫幾乎就是根據項目樹的結構創建。
    • 在Subversion,版本庫看起來像是一個單獨的文件系統,每次提交導致一個新的文件系統;本質上,版本庫是一堆樹,每棵樹都有一個單獨的修訂版本號。當有人談論“修訂版本54”時,他們是在討論一個特定的樹(并且間接來說,文件系統在提交54次之后的樣子)。
    • 技術上講,談論“文件foo.c的修訂版本5”是不正確的,相反,一個人會說“foo.c在修訂版本5出現”。同樣,我們在假定文件的進展時也要小心,在CVS,文件foo.c的修訂版本5和6一定是不同的,在Subversion,foo.c可能在修訂版本5和6之間沒有改變。
    • 類似的,在CVS中標簽或分支是文件的一種標注,或者是單個文件的版本信息,而在Subversion中,標簽和分支是整個目錄樹的拷貝
    • 版本庫作為一個整體,每個文件的許多版本可見:每個分支的最新版本,每個標簽的最新版本以及trunk本身的最新版本。所以,我們再精煉一下術語,我們說“foo.c在修訂版本5出現在/branches/REL1”
  2. 目錄有版本了
    • 因為 SVN 的版本是針對整個倉庫的變遷,所以:
      1. svn addsvn delete現在也工作在目錄上了,就像在文件上一樣,還有svn copysvn move也一樣;然而,這些命令不會導致版本庫即時的變化,相反,工作的項目只是“預定要”添加和刪除,在運行svn commit之前沒有版本庫的修改
      2. 目錄不再是啞容器了;它們也有文件一樣的修訂版本號(更準確一點,談論“修訂版本5的目錄foo/”是正確的)

         

  3. 狀態豐富并合理了
    • 在Subversion,已經設法抹去cvs statuscvs update之間的混亂。
    • cvs status命令有兩個目的:
      • 第一,顯示用戶在工作拷貝的所有本地修改,
      • 第二,顯示給用戶哪些文件是最新的。
    • 很不幸,因為CVS難以閱讀的狀態輸出,許多CVS用戶并沒有充分利用這個命令的好處。相反,他們慢慢習慣運行cvs updatecvs -n update來快速查看區別,如果用戶忘記使用-n選項,副作用就是將還沒有準備好處理的版本庫修改合并到工作拷貝。
    • 對于Subversion,通過修改svn status的輸出使之同時滿足閱讀和解析的需要來努力消除這種混亂,同樣,svn update只會打印將要更新的文件信息,而不是本地修改
    • 詳細說明:
      status (stat, st): 顯示工作副本中目錄與文件的狀態
              用法: status [PATH...]
              未指定參數時,只顯示本地修改的條目(沒有網絡訪問)。
              使用 -q 時,只顯示本地修改條目的摘要信息。
              使用 -u 時,增加工作版本和服務器上版本過期信息。
              使用 -v 時,顯示每個條目的完整版本信息。
              輸出的前六欄各占一個字符寬度:
              第一欄: 表示一個項目是增加、刪除,還是修改
              “ ” 無修改
              “A” 增加
              “C” 沖突
              “D” 刪除
              “I” 忽略
              “M” 改變
              “R” 替換
              “X” 未納入版本控制,但被外部項目所用
              “?” 未納入版本控制
              “!” 該項目已遺失(被非 svn 命令刪除)或不完整
              “~” 版本控制下的項目與其它類型的項目重名
              第二欄: 顯示目錄或文件的屬性狀態
              “ ” 無修改
              “C” 沖突
              “M” 改變
              第三欄: 工作副本目錄是否被鎖定
              “ ” 未鎖定
              “L” 鎖定
              第四欄: 已調度的提交是否包含副本歷史
              “ ” 沒有包含
              “+” 包含
              第五欄: 該條目相對其父目錄是否已切換
              “ ” 正常
              “S” 已切換
              第六欄: 版本庫鎖定標記
              (沒有 -u)
              “ ” 沒有鎖定標記
              “K” 存在鎖定標記
              (使用 -u)
              “ ” 沒有在版本庫中鎖定,沒有鎖定標記
              “K” 在版本庫中被鎖定,存在鎖定標記
              “O” 在版本庫中被鎖定,鎖定標記在一些其他工作副本中
              “T” 在版本庫中被鎖定,存在鎖定標記但已被竊取
              “B” 沒有在版本庫中被鎖定,存在鎖定標記但已被終止
              是否過期的信息出現的位置是第八欄(與 -u 并用時):
              “*” 服務器上有更新版本
              “ ” 工作副本是最新版的
              剩余的欄位皆為變動寬度,并以空白隔開:
              工作版本號(使用 -u 或 -v 時)
              最后提交的版本與最后提交的作者(使用 -v 時)
              工作副本路徑總是最后一欄,所以它可以包含空白字符。
              范例輸出:
              svn status wc
              M     wc/bar.c
              A  +   wc/qax.c
              svn status -u wc
              M           965    wc/bar.c
              *     965    wc/foo.c
              A  +         965    wc/qax.c
              Status against revision:   981
              svn status --show-updates --verbose wc
              M           965       938 kfogel       wc/bar.c
              *     965       922 sussman      wc/foo.c
              A  +         965       687 joe          wc/qax.c
              965       687 joe          wc/zig.c
              Status against revision:   981
              有效選項:
              -u [--show-updates]      : 顯示更新信息
              -v [--verbose]           : 打印附加信息
              -N [--non-recursive]     : 過時;嘗試 --depth=files 或 --depth=immediates
              --depth ARG              : 受深度參數 ARG(“empty”,“files”,“immediates”,或“infinity”) 約束的操作
              -q [--quiet]             : 不打印信息,或只打印概要信息
              --no-ignore              : 忽略默認值和 svn:ignore 屬性
              --incremental            : 給予適合串聯的輸出
              --xml                    : 輸出為 XML
              --ignore-externals       : 忽略外部項目
              --changelist ARG         : 只能對修改列表 ARG 成員操作
              [aliases: --cl]
              

       

  4. 分支和標簽自然了
    • Subversion不區分文件系統空間和“分支”空間;分支和標簽都是普通的文件系統目錄,這恐怕是CVS用戶需要逾越的最大心理障礙;-)
    • 帶來的好處是 分支自然可見了!標簽不必要了!
      • 開辟分支,只是將目錄復制到約定的分支容器中,比如說:
        • $ svn cp trunk branches/my-proj-branch_0.1
      • 在CVS 中作為changeset(修訂集)來使用的標簽 在SVN 中,版本號天然就包含了這一特性, 完全可以用版本號來當 標簽用!
    • 注意:
      因為Subversion把分支和標簽看作普通目錄看待,一直要記住檢出項目的trunk(http://svn.example.com/repos/calc/trunk/),
              而不是項目本身的(http://svn.example.com/repos/calc/)。
              如果你錯誤的檢出了項目本身,你會緊張的發現你的項目拷貝包含了所有的分支和標簽
              

5.1.2. 遷移 CVS 到 SVN

  • 要享用SVN 帶來的便利,最直接的方法就是遷移原先的版本倉庫到SVN來;
  • 最流行的(好像是最成熟的)轉化工具是cvs2svn(http://cvs2svn.tigris.org/), 它是最初由Subversion自己的開發社區成員開發的一個Python腳本:它會多次掃描你的CVS版本庫,并盡可能嘗試推斷提交,分支和標簽,當它 結束時,結果是可以代表代碼歷史的Subversion版本庫或可移植的Subversion轉儲文件,關于指令和警告的詳細信息可以看官方網站.

5.2. 客戶端

SVN 有豐富的客戶端軟件可以選擇,一般命令行內置工具已經足夠好用,但是對習慣窗口界面的人,SVN 也有很多選擇,其中最穩定和友好的是官方社區創建的:

  • TortoiseSVN
    • 這是和Windows 資源管理器緊密結合的工具,所有操作都包含在右鍵菜單中;
    • 同時也包含了 合并,diff查閱,遠程倉庫瀏覽器 等等豐富的支持;
    • 而且支持世界上大多數地區語言的界面;

       

      建議Windows 中的用戶下載體驗;

5.3. 高級管理

SVN 作為成熟的版本管理系統,可以支持各種級別的開發支持; 當面對大型復雜系統開發時,作為基礎配置管理支持系統,必須擁有一些高級功能來支撐復雜業務,這里介紹幾方面常用知識;

5.3.1. 常用分支模式

  • 版本控制在軟件開發中廣泛使用,這里是團隊里程序員最常用的兩種分支/合并模式的介紹,如果你不是使用Subversion軟件開發,可隨意跳過 本小節,如果你是第一次使用版本控制的軟件開發者,請更加注意,以下模式被許多老兵當作最佳實踐,這個過程并不只是針對Subversion,在任何版本 控制系統中都一樣,但是在這里使用Subversion術語會感覺更方便一點。

5.3.1.1. 發布分支

  • 大多數軟件存在這樣一個生命周期:編碼、測試、發布,然后重復。這樣有兩個問題,第一,開發者需要在質量保證小組測試假定穩定版本時繼續開發新特 性,新工作在軟件測試時不可以中斷,第二,小組必須一直支持老的發布版本和軟件;如果一個bug在最新的代碼中發現,它一定也存在已發布的版本中,客戶希 望立刻得到錯誤修正而不必等到新版本發布。
  • 這是版本控制可以做的幫助,典型的過程如下:
    1. 開發者提交所有的新特性到主干。 每日的修改提交到/trunk:新特性,bug修正和其他。
    2. 這個主干被拷貝到“發布”分支。 當小組認為軟件已經做好發布的準備(如,版本1.0)然后/trunk會被拷貝到/branches/1.0。
    3. 項目組繼續并行工作,一個小組開始對分支進行嚴酷的測試,同時另一個小組在/trunk繼續新的工作(如,準備2.0),如果一個bug在任何一個位置被發現,錯誤修正需要來回運送。然而這個過程有時候也會結束,例如分支已經為發布前的最終測試“停滯”了。
    4. 分支已經作了標簽并且發布,當測試結束,/branches/1.0作為引用快照已經拷貝到/tags/1.0.0,這個標簽被打包發布給客戶。
    5. 分支多次維護。當繼續在/trunk上為版本2.0工作,bug修正繼續從/trunk運送到/branches/1.0,如果積累了足夠的bug修正,管理部門決定發布1.0.1版本:拷貝/branches/1.0到/tags/1.0.1,標簽被打包發布。

       

      整個過程隨著軟件的成熟不斷重復:
    • 當2.0完成,一個新的2.0分支被創建,測試、打標簽和最終發布,
    • 經過許多年,版本庫結束了許多版本發布,進入了“維護”模式,許多標簽代表了最終的發布版本。

5.3.1.2. 特性分支

  • 一個特性分支是本章中那個重要例子中的分支,你正在那個分支上工作,而Sally還在/trunk繼續工作,這是一個臨時分支,用來作復雜的修改 而不會干擾/trunk的穩定性,不象發布分支(也許要永遠支持),特性分支出生,使用了一段時間,合并到主干,然后最終被刪除掉,它們在有限的時間里有 用。
  • 還有,關于是否創建特性分支的項目政策也變化廣泛,一些項目永遠不使用特性分支:大家都可以提交到/trunk,好處是系統的簡單— 沒有人需要知道分支和合并,壞處是主干會經常不穩定或者不可用,另外一些項目使用分支達到極限:沒有修改曾經直接提交到主干,即使最細小的修改都要創建短 暫的分支,然后小心的審核合并到主干,然后刪除分支,這樣系統保持主干一直穩定和可用,但是造成了巨大的負擔。
  • 許多項目采用折中的方式,堅持每次編譯/trunk并進行回歸測試,只有需要多次不穩定提交時才需要一個特性分支,這個規則可以用這 樣一個問題檢驗:如果開發者在好幾天里獨立工作,一次提交大量修改(這樣/trunk就不會不穩定。),是否會有太多的修改要來回顧?如果答案是“是”, 這些修改應該在特性分支上進行,因為開發者增量的提交修改,你可以容易的回頭檢查。
  • 最終,有一個問題就是怎樣保持一個特性分支“同步”于工作中的主干,在前面提到過,在一個分支上工作數周或幾個月是很有風險的,主干的修改也許會持續涌入,因為這一點,兩條線的開發會區別巨大,合并分支回到主干會成為一個噩夢。
  • 這種情況最好通過有規律的將主干合并到分支來避免,制定這樣一個政策:每周將上周的修改合并到分支,注意這樣做時需要小心,需要手工記 錄合并的過程,以避免重復的合并(在“手工跟蹤合并”一節描述過),你需要小心的撰寫合并的日志信息,精確的描述合并包括的范圍(在“合并分支到另一分支 ”一節中描述過),這看起來像是脅迫,可是實際上是容易做到的。
  • 在一些時候,你已經準備好了將“同步的”特性分支合并回到主干,為此,開始做一次將主干最新修改和分支的最終合并,這樣以后,除了你的分支修改的部分,最新的分支和主干將會絕對一致,所以在這個特別的例子里,你會通過直接比較分支和主干來進行合并:
    $ cd trunk-working-copy
        $ svn update
        At revision 1910.
        $ svn merge http://svn.example.com/repos/calc/trunk@1910     http://svn.example.com/repos/calc/branches/mybranch@1910
        U  real.c
        U  integer.c
        A  newdirectory
        A  newdirectory/newfile
        …
        
    通過比較HEAD修訂版本的主干和HEAD修訂版本的分支,你確定了只在分支上的增量信息,兩條開發線都有了分枝的修改。

5.3.2. HOOKS

和CVS 類似SVN 同樣為自動化事務響應開辟有"HOOKS"~鉤子腳本支持;只是更加精簡和規范化了;

一般提供9類標準鉤子模板:

$ ls repos/hooks/
post-commit.tmpl	  post-unlock.tmpl  pre-revprop-change.tmpl
post-lock.tmpl		  pre-commit.tmpl   pre-unlock.tmpl
post-revprop-change.tmpl  pre-lock.tmpl     start-commit.tmpl

分別響應核心的四類操作:

HOOK 觸發事件 參數
start-commit 提交事務產生前 REPOS-PATH:到版本庫的路徑;USER:要進行提交的用戶名
pre-commit 事務完成提交之前 REPOS-PATH:版本庫的路徑;TXN-NAME正在提交的事務名稱
post-commit 事務完成后 REPOS-PATH:到版本庫的路徑;REV:被創建的新的修訂版本號
pre-revprop-change 修訂版本屬性變更前 REPOS-PATH:到版本庫的路徑;REVISION:要修改屬性的修訂版本;USER:經過認證的用戶名;ACTION:屬性自身的名字
post-revprop-change 修訂版本屬性被改變之后 REPOS-PATH:到版本庫的路徑;REVISION:屬性存在的修訂版本;USER:經過校驗的產生變化的用戶名;ACTION:和屬性自身的名字
pre-lock 嘗試鎖定文件時 REPOS-PATH:到版本庫的路徑;PATH:鎖定的路徑;USER:企圖執行鎖定的用戶
post-lock 路徑被鎖定后執行 REPOS-PATH:到版本庫的路徑;USER:企圖執行鎖定的用戶
pre-unlock 企圖刪除一個文件上的鉤子時 REPOS-PATH:到版本庫的路徑;PATH:鎖定的路徑;USER:企圖解鎖的用戶
post-unlock 路徑被解鎖后 REPOS-PATH:到版本庫的路徑;USER:企圖解鎖的用戶
警告:
  • 不要嘗試用鉤子腳本修改事務。一個常見的例子就是在提交時自動設置svn:eol-style 或svn:mime-type這類屬性。這看起來是個好主意,但它會引起問題。主要的問題是客戶并不知道由鉤子腳本進行的修改,同時沒有辦法通告客戶它的 數據是過時的,這種矛盾會導致出人意料和不能預測的行為。
  • 作為嘗試修改事務的替代,我們通過檢查pre-commit鉤子的事務,在不滿足要求時拒絕提交。

5.3.2.1. 強制寫注釋

舉個實用的HOOKS 腳本實例:

  • pre-commit.tmpl 重命名為:pre-commit 并修訂為以下內容:
    #!/bin/sh
        # PRE-COMMIT HOOK
        REPOS="$1"
        TXN="$2"
        SVNLOOK=/usr/local/bin/svnlook
        $SVNLOOK log -t "$TXN" "$REPOS" |     grep "[a-zA-Z0-9]" > /dev/null
        if [ $? != 0 ]; then
        echo "$TXN $REPOS" 1>&2
        echo "Alert! Commit message may not be empty." 1>&2
        exit 1
        fi
        exit 0
        
  • 然后配置可執行屬性,就可以自動拒絕空注釋的檢入事務,并送回對應提示:"Alert! Commit message may not be empty."

5.4. 項目管理

SVN作為基礎配置管理支撐系統,可以輕快的完成版本管理的全方位支持了,而且,進一步的配合Trac 可以完成項目管理的大部分流程支持!

5.4.1. Trac

Trac 是種輕型全功能項目管理環境,主要特性有:

  • 以維基為核心的內容組織
  • 以傳票為核心的任務式流程
  • 提供豐富的 TrackInks 維基字符約定,可以在任何場所方便的指向 SVN版本/傳票/報表等等所有Trac 內部資源
  • 類SQL語句的報表定制支持
  • 里程碑綜合視圖
  • 等等

     

    詳細的敬請期待哲思手冊相關文章;

     

    PS:

     

    Trac中文化項目長期由 Zoom.Quiet 團隊支持,推薦體驗;

6. 文檔版本

  • v0.9 090308 ZoomQuiet 完成初稿
  • v0.8 090303 ZoomQuiet 完成管理SVN部分,以及日常使用大部
  • v0.7 090216 ZoomQuiet 增補文檔大綱
  • v0.6 090209 ZoomQuiet 認領寫作
  • v0.5 080301 zeuux 創建
本站僅提供存儲服務,所有內容均由用戶發布,如發現有害或侵權內容,請點擊舉報
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
圖文:eclipse中SVN分支合并到主干 | Darren Fang的生活點滴
版本控制軟件SubVersion 入門 - Powered by iNewS4
SVN介紹和安裝部署
SVN中Branch的創建與合并
linux下svn的使用
詳細說明svn分支與合并,以及實例
更多類似文章 >>
生活服務
分享 收藏 導長圖 關注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點擊這里聯系客服!

聯系客服

主站蜘蛛池模板: 阿瓦提县| 邻水| 离岛区| 黄骅市| 临朐县| 拜城县| 温宿县| 襄樊市| 长岛县| 惠来县| 枣庄市| 民勤县| 天祝| 富民县| 兴安县| 页游| 鄱阳县| 兴隆县| 邛崃市| 富蕴县| 阳谷县| 那坡县| 谢通门县| 长海县| 莆田市| 项城市| 玉门市| 朝阳市| 永安市| 邵阳市| 顺昌县| 双城市| 伊川县| 潼关县| 达孜县| 库尔勒市| 礼泉县| 雷波县| 普定县| 小金县| 桂平市|