作為版本控制的管理工具,雖然微軟的Visual SourceSafe有許多不盡如人意的地方,這也是很多人所抱怨的。但是我認為,更多時候的使用不便,是因為對工具的不熟悉而導致的。這個教程是筆者在幾個月前考察版本控制時根據(jù)VSS的聯(lián)機幫助文檔改編而成的。與其說是教程,到不如說是一本簡明手冊,因為其內(nèi)容涵蓋了VSS的全部功能,并從中提取了自認為重要的和有價值的東西,將之翻譯成中文。其中不乏有好的建議和使用技巧,比如:定期備份完整的VSS數(shù)據(jù)目錄,定期清除臨時目錄的內(nèi)容,盡量使用一個數(shù)據(jù)庫存放所有文件,使用虛擬回滾(Virtual RollBack)代替普通回滾,排他性簽出的使用,Cloak操作等等,不一而足。
對于Branch/Share/Pin/Label這幾項功能的融合使用,正文及附錄的相關部分提供了相當不錯的范例,演示了如何通過靈活運用諸項功能,以自如應對不同的開發(fā)場景。筆者在看到這部分內(nèi)容時,一時間有了恍然大悟之感,心中不禁想到,原來VSS也可以如此用法。相信這些范例對大家也會有不小的啟示和“震撼”的。
此外,附錄部分的“VSS命令-權限級別對應表”是筆者整理之后的結果,有了它,大家對不同權限的用戶可以使用何種功能,自會變得一目了然。
希望這個教程可以對并不十分熟悉VSS的開發(fā)人員和管理人員有所幫助,同時也希望可以借此機會澄清一下大家對VSS的一些“偏見”:)
1 說明
一、本教程針對不同使用對象提供Visual SourceSafe 6.0的若干使用指導,閱讀對象包括Visual SourceSafe的管理員和普通用戶,以及希望了解如何采用Visual SourceSafe進行軟件版本控制的管理人員。管理員或普通用戶在使用Visual SourceSafe的過程中,如果遇到不知如何操作,或者對某些操作的注意事項不甚了解等類似情況時,可以查閱本教程。
二、本教程的"管理員部分"是管理員必讀的,如果管理員在除履行其自身職責之外,還兼任普通用戶的角色,則可以參閱教程中的"普通用戶部分"。作為一般的普通用戶,只需閱讀"普通用戶部分"即可。
三、教程中列舉的操作,加星號者,為高級用法(Advanced Usage),其余為基本用法(Basic Usage)。所謂基本用法是指一些通常使用頻繁的,或者是使用方法較為簡單的操作。所謂高級用法是指通常使用頻率不多,或者較為重要的,或者用法復雜的操作。
四、本教程內(nèi)容摘選并改編自Visual SourceSafe 6.0英文版聯(lián)機幫助,從中提取了諸多重要信息、容易忽略的內(nèi)容以及若干注意事項。一些基本內(nèi)容(主要指某些基本操作的使用方法)只簡單列舉了條目,欲了解這些條目的詳細情況請查看聯(lián)機幫助的相關部分,可以通過列于這些條目之后的英文說明在聯(lián)機幫助中搜索到相關內(nèi)容。
五、本教程不涉及Visual SourceSafe圖形用戶界面操作的解釋說明,對指定功能的具體操作步驟請查看聯(lián)機幫助的相關部分。可以通過列于該功能之后的英文說明在聯(lián)機幫助中搜索到相關內(nèi)容。
六、在其他Visual Studio產(chǎn)品中(例如:Visual C++)可以集成Visual SourceSafe的功能,本教程不涉及有關在其他集成開發(fā)環(huán)境下如何使用Visual SourceSafe功能的內(nèi)容,這部分內(nèi)容主要針對普通用戶。對這些內(nèi)容的了解,在閱讀完本教程之后,將會變得容易。此外,某些操作在Visual SourceSafe環(huán)境下使用更為方便。
2 概述
Visual SourceSafe(以下簡稱VSS)是一種版本控制管理工具。它通過將各種類型的文件(包括:文本文件、圖像文件、二進制文件、聲音文件、視頻文件等)存入其內(nèi)部數(shù)據(jù)庫的方式,幫助你有效地管理工程(Project,關于VSS中工程的概念請見下面)。它允許你在多個工程間共享同一組文件;你可以將一個文件添加到數(shù)據(jù)庫中,以便其他相關人員使用;任何對文件的更改將被記錄下來,以便在任何時候可以恢復到該文件的某個舊版本。
VSS的工程組織方式使團隊協(xié)作開發(fā)變得更為容易和直觀。一個工程是一組存放于VSS數(shù)據(jù)庫內(nèi)的任意類型的文件,一個工程類似于操作系統(tǒng)中的目錄,但VSS為其提供了版本控制、歷史記錄、文件合并等更多的功能支持。
3 管理員部分
3.1 維護用戶列表(Maintain the User List)
3.1.1 添加用戶(Add a User)
此處略,詳細內(nèi)容請查閱聯(lián)機幫助。
3.1.2 更改密碼(Change Passwords)
此處略,詳細內(nèi)容請查閱聯(lián)機幫助。
3.1.3 創(chuàng)建用戶列表(Create a User List)
此處略,詳細內(nèi)容請查閱聯(lián)機幫助。
3.1.4 刪除用戶(Delete a User)
此處略,詳細內(nèi)容請查閱聯(lián)機幫助。
3.1.5 編輯用戶屬性(Edit User Attributes)
此處略,詳細內(nèi)容請查閱聯(lián)機幫助。
3.2 管理數(shù)據(jù)庫(Manage the Database)
3.2.1 分析數(shù)據(jù)目錄(Analyze the Data Folder)*
建議你定期備份完整的VSS數(shù)據(jù)目錄(參見數(shù)據(jù)庫打包)。VSS數(shù)據(jù)目錄中包含有全部工程和文件的數(shù)據(jù)庫信息。由于網(wǎng)絡或操作系統(tǒng)的某些故障,VSS中的文件可能存在錯誤和不一致問題,Analyze VSS DB工具被用來查找和修復這些問題。在運行該工具前,需要鎖定(Lock)所有用戶并要求他們退出VSS,用戶可以在一個數(shù)據(jù)庫被鎖定時保持文件的簽出狀態(tài)(參見鎖定數(shù)據(jù)庫)。建議分兩次運行Analyze VSS DB工具,第一次修復錯誤,第二次核查是否仍然存在沒有被修復的錯誤。數(shù)據(jù)目錄的具體位置是由Data_Path初始化變量在SRCSAFE.INI文件中指定的(參見定制SS.INI和SRCSAFE.INI文件)。
3.2.2 數(shù)據(jù)庫打包(Archive Databases)*
你可能需要定期地備份VSS數(shù)據(jù)庫,或者數(shù)據(jù)庫的某一部分。VSS Administrator工具提供了此項功能。它可以:
節(jié)省VSS數(shù)據(jù)庫服務器的磁盤空間。
加快顯示歷史記錄操作(Show History)的速度。
便于在多個VSS數(shù)據(jù)庫間傳遞文件和工程,保持歷史記錄完整無缺。
備份全部或部分VSS數(shù)據(jù)庫內(nèi)容并壓縮成文件。
3.2.3 清除臨時目錄(Clean Temporary Folder)
VSS通常在運行時把臨時結果放在臨時目錄里,并在退出前將之刪除。由于某些原因,例如非正常重啟,可能導致臨時內(nèi)容殘留在目錄中。作為管理員,你有責任定期清除臨時目錄的內(nèi)容。每隔幾周一次,當沒有任何用戶運行VSS或VSS Administrator時,請清除臨時目錄的內(nèi)容。臨時目錄的具體位置是由Temp_Path初始化變量在SRCSAFE.INI文件中指定的(參見定制SS.INI和SRCSAFE.INI文件)。
3.2.4 鎖定數(shù)據(jù)庫(Lock a Database)
數(shù)據(jù)庫鎖定功能將不會自動鎖定那些當前已經(jīng)登錄的用戶,你應該在鎖定數(shù)據(jù)庫之前要求登錄用戶退出VSS。在重新允許用戶使用VSS之前,需要解除對數(shù)據(jù)庫的鎖定。
3.2.5 數(shù)據(jù)庫恢復(Restore Databases)
此處略,詳細內(nèi)容請查閱聯(lián)機幫助。
3.2.6 使用多個數(shù)據(jù)庫(Work with Multiple Databases)*
缺省時,VSS將所有文件集中放在一個數(shù)據(jù)庫中。如果可能,應盡量使用一個數(shù)據(jù)庫存放所有文件,這比分多個數(shù)據(jù)庫存放要好,因為:
你不能在多個數(shù)據(jù)庫間共享(Share)文件(參見對文件和工程的Branch/Share操作)。
將位于多個數(shù)據(jù)庫中的內(nèi)容集中在一起是比較困難的,需要使用VSS Administrator的Archive功能(參見數(shù)據(jù)庫打包)。
出于安全的考慮,VSS的用戶信息,包括密碼在內(nèi),是和數(shù)據(jù)一起存放的。
如果為了安全起見,要將信息拆分成多個獨立的數(shù)據(jù)庫,
缺省時,VSS將所有文件集中放在一個數(shù)據(jù)庫中。如果可能,應盡量使用一個數(shù)據(jù)庫存放所有文件,這比分多個數(shù)據(jù)庫存放要好,因為:你不能在多個數(shù)據(jù)庫間共享(Share )文件(參見對文件和工程的Branch/Share操作)。
將位于多個數(shù)據(jù)庫中的內(nèi)容集中在一起是比較困難的,需要使用VSS Administrator 的Archive功能(參見數(shù)據(jù)庫打包)。
出于安全的考慮,VSS的用戶信息,包括密碼在內(nèi),是和數(shù)據(jù)一起存放的。如果為了安全起見,要將信息拆分成多個獨立的數(shù)據(jù)庫,這種信息存儲方式將帶來極大的便利,但你必須為每個數(shù)據(jù)庫都單獨添加用戶。
3.3 有關權限的話題(About Rights)
3.3.1 權限的傳遞(Rights Propagation)
當你添加了一個新用戶,并為該用戶設置了針對某個工程的權限時,將在VSS數(shù)據(jù)庫中建立起一個assignment。該 assignment將會沿著工程樹向下傳遞直至遇到另一個assignment。
例如:針對工程"$/" ,你為用戶A指定了Add權限(參見安全訪問權限),而對于工程"$/Sample",你沒有為用戶顯式指定權限,則該用戶將對工程"$/Sample"自動擁有Add權限。當你在工程"$/Sample/BusinessObject"處為其指定了Read權限后,將阻止早先assignment的向下傳遞過程,所以用戶A對該工程(指"$/Sample/BusinessObject")及其子工程都只具有Read權限了。
當你首次添加一個用戶時,該用戶在工程"$/"處被賦予的權限由"缺省權限"決定,缺省權限是通過在VSS Administrator里設置Project Security屬性頁的內(nèi)容來定義的。你可以通過修改該頁內(nèi)容,全局性地變更所有用戶的缺省權限。
3.3.2 安全訪問權限(Security Access Rights)
3.3.2.1 缺省安全設置
當安裝VSS后,缺省安全設置將被啟用。你可以利用定制的方式,使某些用戶擁有對某些工程和某些VSS命令的特定權限。
缺省安全設置很簡單,當添加新用戶時,你只有兩種級別的訪問權限可供選擇:
只讀權限(Read-only rights):用戶可以查看VSS中的任何內(nèi)容,但不能更改。
可讀寫權限(Read/write rights):用戶可以查看和修改VSS中的任何內(nèi)容。
如果這樣的訪問權限級別足以應對日常使用,那么就無需再增強安全控制的級別了。
所有的VSS安全管理都在VSS Administrator中進行。任何能運行該程序的用戶都可以改變VSS的任意特性,所以最好只有管理員才使用該程序。
3.3.2.2 更高級別的安全控制
在VSS中,對工程的安全性控制,是通過制定用戶訪問權限來實現(xiàn)的。每個工程僅能被那些具有相應權限的用戶訪問到,每個命令僅能被那些具有相應權限的用戶使用。可以通過VSS Administrator來定制權限,以達到更高級別的安全控制。
以下是VSS的權限級別列表,下列每種權限都擁有該權限之前的全部權限。例如:擁有Check Out權限的用戶,也將同時擁有Read權限。(參見附錄A2:VSS中部分命令的對應權限級別)
權限 描述
Read (R) 類似于缺省安全設置中的只讀權限
Check Out (C) 可以使用Check Out/Check In/Undo Check Out等命令對文件進行修改
Add (A) 可以使用Add/Delete/Label/Rename等命令對文件進行修改
Destroy(D) 可以使用 Destroy/Purge/Rollback等命令對文件實施永久刪除操作
4 普通用戶部分
4.1 對工程、文件的一般性使用(Normal Use about Projects and Files)
4.1.1 打開/關閉數(shù)據(jù)庫(Open/Close a Database)
此處略,詳細內(nèi)容請查閱聯(lián)機幫助。
4.1.2 創(chuàng)建新工程(Create New Projects)
此處略,詳細內(nèi)容請查閱聯(lián)機幫助。
4.1.3 添加文件、目錄、工程(Add Files,F(xiàn)olders,and Projects)
此處略,詳細內(nèi)容請查閱聯(lián)機幫助。
4.1.4 刪除和恢復文件、工程(Delete and Recover Files and Projects)
VSS提供了3種刪除文件的方法:
- Delete:VSS只把指定文件從當前工程中刪除,而在VSS數(shù)據(jù)庫中仍留有該文件的記錄。此外,其他共享了該文件的工程仍保留此文件(參見對文件和工程的Branch/Share操作)。
- Destroy:VSS將把指定文件從VSS數(shù)據(jù)庫中徹底刪除,其后將無法恢復。
- Purge:永久性刪除已被Delete掉的文件,其后將無法恢復。
對于共享文件,Delete和Destroy僅將文件從當前所選工程中刪除掉,其他共享了該文件的工程,以及VSS數(shù)據(jù)庫中,仍留有此文件。
4.1.5 移動文件和工程(Move Files and Projects)
移動一個文件的唯一方法是,在文件新所在位置的上一級工程(parent project)處使該文件共享(參見對文件和工程的Branch/Share操作),然后將原有工程(original project)下的該文件Delete或者 Destroy(參見刪除和恢復文件、工程)。移動后,文件的歷史記錄將被保留。
通過使用Move命令,你可以將一個子工程(subproject)從某個上級工程重置到另一個工程下。該操作不會改變子工程的內(nèi)容和歷史記錄,但它會影響上級工程的歷史記錄(包括子工程所在的原有上級工程和新的上級工程)。當移動一個工程后,你將無法重建原有上級工程的某個舊版本。
4.1.6 重命名文件、工程(Rename Files or Projects)
若某個文件被多個工程所共享,對該文件的重命名將影響所有工程,而在Branch狀態(tài)下,則不影響(參見對文件和工程的Branch/Share操作)。
4.1.7 設置工作目錄(Set Working Folders)
此處略,詳細內(nèi)容請查閱聯(lián)機幫助。
4.2 簽入、簽出、獲取、查看及相關操作(Check In/Out、Get、View and Other Related Use)
4.2.1 簽入簽出操作(Check In and Check Out Files)
此處略,詳細內(nèi)容請查閱聯(lián)機幫助。
4.2.2 撤銷簽出(Undo Check Out)
執(zhí)行該操作時,若用戶選擇了替換本地文件,則用戶將丟失最近一次簽出后對該文件在本地的更改。
4.2.3 獲取最近版本(Get Latest Version)
此處略,詳細內(nèi)容請查閱聯(lián)機幫助。
4.2.4 獲取早期版本(Get Earlier Version)
此處略,詳細內(nèi)容請查閱聯(lián)機幫助。
4.2.5 獲取和查看文件、工程(Get and View Files and Projects)
Get操作將文件或工程拷貝至本地的工作目錄,并設置為read-only屬性。可以用View操作查看文件內(nèi)容,此時用戶無需設置工作目錄。
盡量不要刪除vssver.scc文件。本地工作目錄及每個子目錄下都包含一個這樣的文件,VSS利用其中記錄的信息確定本地目錄中哪個文件已經(jīng)更改了。刪除后,將使新一次的Get操作速度減慢。
4.2.6 回滾到以前版本(Rollback to Previous Versions)
該操作將使文件的內(nèi)容恢復到先前某個版本時的狀態(tài),它將使所有在該版本后所做的改動丟失。如果你所回滾的文件被多個工程共享,則操作只影響你所指定的那個工程,并且它會自動實行Branch操作(參見對文件和工程的 Branch/Share操作)。建議你使用虛擬回滾(Virtual Rollback),它將不會使隨后的改動永久丟失。具體操作如下:
- 選擇你要回滾的文件并簽出
- 使用Get命令獲取某個原有版本到本地
- 簽入該文件
4.2.7 多人同時簽出一個文件(Check Out Multiple Files) *
缺省狀態(tài)下,一個文件只允許一個人簽出,管理員可以通過修改配置,允許多人同時簽出。此時,VSS將跟蹤所有簽出該文件的用戶。每當用戶簽入時,VSS都將和當前存于數(shù)據(jù)庫內(nèi)的最新版本進行比較,若用戶修改的是同一文件的不同處,VSS將進行簡單的合并(Merge),否則提示用戶,并且不允許簽入。用戶可以通過VSS提供的Visual Merge工具,比較存放于VSS數(shù)據(jù)庫中的文件和本地文件的異同,手工修改本地文件,直到認為已經(jīng)可以簽入時,方才執(zhí)行最終簽入操作。(參見合并)
4.2.8 合并(Merge)*
在VSS中,合并可能發(fā)生在3種場合下:使用Multiple Checkout的工作方式;合并原先已經(jīng)Branch了的文件;獲取(Get)文件。
- Multiple Checkout:若多個用戶同時簽出一個文件,第一個用戶只要簡單的簽入就可以了。后續(xù)用戶也可以簽入,但他們的更改將需要和其他所有用戶的更改合并,VSS將得到完整的更改內(nèi)容(參見多人同時簽出一個文件 )。
- Branch:當被Branch的文件合并到其中一個分支時,VSS將會把在另一個分支上所做的改動合并到該分支上(參見對文件和工程的Branch/Share操作)。
- Merge on Get:在Multiple Checkout工作方式下,當使用Get Latest Version操作時可能引發(fā)合并操作,此時保存在VSS數(shù)據(jù)庫中的內(nèi)容將合并到本地文件。但如果某個文件是排他性簽出的,則不會引發(fā)合并操作(參見排他性簽出 )。
在完成一個合并之后,VSS遵循如下規(guī)則:
- 如果仍有沖突,VSS維持文件的簽出狀態(tài),為了使文件能順利簽入,你必須排除這些沖突。
- 如果你使用Merge Branches命令,將一個文件合并到一個工程中,而該工程中的對應文件已被簽出,該文件將繼續(xù)保持簽出狀態(tài)(參見對文件和工程的Branch/Share操作)。
- 在任何其他時候,VSS將會提示你,或者在合并后自動簽入,或者保持文件的簽出狀態(tài)以使你在更新VSS數(shù)據(jù)庫中內(nèi)容之前再核查一邊。
缺省情況下,當發(fā)生沖突時,VSS將啟用其Visual Merge工具。
4.2.9 排他性簽出(Exclusive Check Out)*
允許多人同時簽出一個文件是針對整個VSS數(shù)據(jù)庫而言的,但用戶仍可以根據(jù)實際情況,針對某些文件修改該規(guī)則。對某個文件實施排他性簽出,則其他用戶將無法簽出該文件,直至該用戶使用了簽入操作。
4.2.10 對工程的Cloak操作(Cloak Projects)*
若對某工程實行了Cloak操作,則當對該工程的上一級工程進行Get/Check In/Check Out/Undo Check Out/Project Difference操作時,將不會影響該工程及其子工程。而在該工程上進行類似操作時,則和平常得到的結果一樣。這一屬性將傳遞給其下的子工程。
例如:某個工程其路徑為$/Application,下面有三個子工程:$/Application/Code,$/Application/Test,$/Application/Docs,而 Docs工程下的內(nèi)容可能對你沒有任何用處。當你每次從$/Application處進行Get操作后,都需要從本地刪除多余的Docs目錄。此時可以對Docs 進行Cloak操作。這樣,每次的Get操作將只把Code和Test下的內(nèi)容放到本地。如果你需要獲取Docs工程下的內(nèi)容,則可以單獨從Docs處進行Get 操作。
4.3 Branch、Share、Label和Pin操作(Branch、Share、Label and Pin)
4.3.1 對文件和工程的Branch/Share操作(Branch and Share Files and Projects) *
在VSS中,通過Share操作,一個文件可以被多個工程共享,在任何一個工程中對該文件的更改,都將反映到其他相關工程里。
Branch操作則消除這種共享,每次將一個被共享的文件拆成兩個分支,在不同工程中分別跟蹤該文件。通過查看文件屬性的Links屬性頁可以了解該文件被哪些工程共享,通過查看Paths屬性頁可以了解文件的分支狀況。
例如:產(chǎn)品目前的正式版本為2.0(工程路徑為$/Application),在加入新功能后將升級為3.0。但在開始升級的過程中,其間的一個過渡版本2.1存在bug,需要修改。此時可以進行如下操作:選擇被Label標識為2.0的那個版本(參見給文件、工程指定標簽),利用Share功能創(chuàng)建過渡版本(工程路徑為$/Application2.1),此時兩個工程中的文件是共享的,且$/Application2.1中的所有文件都處于Pin狀態(tài)(參見 Pin操作) ,即:在向3.0升級的過程中,對$/Application中相關文件的更改,將不影響$/Application2.1下的內(nèi)容,但此時文件仍是共享的。僅對需要修改bug的文件采取Branch操作。這樣做的好處是,中間版本的bug修改工作和3.0的升級工作可以同時進行,并且最大限度的降低了所需的存儲空間。
4.3.2 給文件、工程指定標簽(Label Files and Projects) *
VSS使用3種方式跟蹤文件的歷史記錄:內(nèi)部版本號,日期,用戶自定義標簽。
標簽可以是一個不超過31個字符長度的串,例如:"1.0"、"2.01b"、"Final Beta"、"Approved for QA"。應用Label功能,用戶就可以獲取某個特定時期的軟件內(nèi)容了。所有當前工程下的文件和子工程都將繼承該標簽。
注意下面幾點:
- 當使用Label功能時,表明你在所選工程的歷史記錄里創(chuàng)建了一個新的版本,但文件和工程本身的內(nèi)容并未發(fā)生變化。
- 對某個工程的某個標簽再次使用Label操作將覆蓋原來的標簽內(nèi)容。
請參見附錄A1:同時維護一個工程的多個版本
4.3.3 Pin操作(Pin)*
該功能對共享文件很有用,盡管它的使用不僅限于共享文件,也包括其他任何文件。當你對一個文件實施Pin操作后,你將不能對之做任何修改。如果一個文件在Pin之后又被實施了Share操作,而被Pin的那個版本同時也是被共享的版本,則所有共享該文件的工程都不能更改該文件。如果一個文件先被實施了Share操作,而后在某個工程中被Pin了,則除了這個工程外的其余工程仍可以更改該文件(參見對文件和工程的Branch/Share操作)。
4.4 其他操作(Other Use)
4.4.1 擴展關鍵字(Expand Keywords)*
VSS可以將某些指定信息(例如:VSS內(nèi)部版本號)直接插入文本文件中。用戶只要將某些關鍵字放入文件的注釋中,每次添加(Add)或簽入(Check In)文件時,VSS都會自動查找這些關鍵字,并將相關信息置于其后。
VSS中常用的關鍵字:
關鍵字 | 描述 |
$Archive: $ | 文件在VSS中的路徑名 |
$Author: $ | 最近一次更改文件的用戶 |
$Date: $ | 最近一次簽入的時間 |
$History: $ | 文件的歷史記錄 |
$Revision: $ | VSS內(nèi)部版本號 |
$NoKeywords: $ | 使VSS對其后的所有關鍵字不進行擴展 |
例如:
在某文件中加入如下一行:
$Revision: $
若當前該文件在VSS內(nèi)部的版本號是22,則簽入后VSS會將之修改為:
$Revision: 23 $
4.4.2 使用Shadow目錄(Work with Shadow Folders)*
Shadow目錄位于服務器端,包含了工程中所有的文件。這些文件既非位于VSS數(shù)據(jù)庫中的master copy,亦非位于本地工作目錄的local copy,而是最近一次簽入的所有內(nèi)容。Shadow目錄應該由管理員來設置。
是否使用Shadow目錄功能是可選的,通常在如下兩種情況下可以考慮使用該功能:
- 為使某些用戶能查看文件(但不能更改),這些用戶可能沒有對VSS的訪問權限。
- 不讓你的本地工作目錄保留可編譯的軟件副本。為使每個用戶都能得到一個最新版本的軟件,所有用戶可能希望在某個目錄下集中進行編譯,而非在各自的工作目錄下編譯。在這種情況下,Shadow目錄功能通常和添加(Add)、簽入(Check In)之后的Remove Local Copy結合使用。
Shadow目錄不會跟蹤子工程的變化,例如:你有一個被Shadow的工程$/A,包含兩個子工程:$/A/1和$/A/2,而你又將$/A/2重命名為 $/A/B,這種變化將不會被反映到Shadow目錄中。你可以手工修改,或者利用Reconcile All功能,使之保持同步。
4.4.3 性能優(yōu)化(Optimize Performance)*
有兩種方法可以改善VSS的性能:盡可能多的將內(nèi)容通過網(wǎng)絡拷貝至本地來做;修改初始化文件對VSS的性能進行微調(diào)。
具體優(yōu)化措施:
- 在SS.INI或SRCSAFE.INI文件中設置如下變量:
Diff_Ignore (PC) = c-e-s-w-
使VSS在進行文件比較時忽略end-of-line標記,從而加快運行效率
CP_OnSelection = No
在使用VSS Explorer時,缺省狀態(tài)下,用戶使用鼠標單擊或使用鍵盤的方向鍵在工程列表上移動時,就會選中工程。設為No后,只有雙擊鼠標或按回車鍵才會選中。
- 設置臨時目錄
缺省情況下,VSS將臨時文件存于服務器端,但管理員可以通過修改SS.INI中的Temp_Path變量,將臨時路徑設置在本地。
- 讓管理員在SRCSAFE.INI文件中將Lock_Mode變量設置為Native
這是SRCSAFE.INI中該變量的缺省設置,把該變量設置為Native將使幾乎所有的VSS操作都得到加速。該變量只能由管理員來設置。
- 管理員通過Disable下面的功能,也可以一定程度地改善性能:
4.4.4 查找文件(Search for Files)
VSS Explore的list view缺省時只顯示當前工程中的所有文件。通過使用Search命令,可以只顯示符合指定要求的文件。例如:只顯示 .h文件,只現(xiàn)實被簽出的文件。Search命令是允許遞歸的。
4.4.5 設置密碼(Set Passwords)
如果VSS管理員指定域賬號為VSS登錄賬號,則用戶登錄VSS時將不會提示輸入密碼。
4.4.6 編寫批處理文件(Writing Batch Files)*
在編寫批處理文件時,一些在命令行方式下使用的交互手段需要改變。
- 屏蔽輸入(Disable Input)
如果你的批處理文件中包含了一系列VSS命令(它們可能需要整夜運行),你一定不希望程序執(zhí)行期間會停下來提示用戶輸入信息。有3個命令行選項可以解決此類問題。
缺省時,VSS在執(zhí)行諸如添加(Add)、簽入(Check In)等操作時會提示你輸入注釋(Comment),利用-c選項可以避免該類提示:
命令 | 描述 |
-c- | 不添加注釋 |
"-cHello" | 使用Hello字串作為注釋 |
-c@COMMENT.TXT | 使用comment.txt文件的內(nèi)容作為注釋 |
此外,VSS通常會要求用戶回答yes或no,你可以使用-i選項避免此類問題:
命令 | 描述 |
-i-y | 對所有此類提問自動回答Yes |
-i-n | 對所有此類提問自動回答No |
-i | 使用缺省回答 |
VSS也可能會提示登錄名,你可以使用-y選項提供足夠多的信息。
- 重定向輸出
缺省時,VSS將所有輸出定向到屏幕,在命令行狀態(tài)下你可以使用-o選項分頁輸出,而在批處理文件中你同樣可以利用-o屏蔽輸出或重定向輸出。
命令 | 描述 |
-o- | 屏蔽輸出 |
-oRESULTS.TXT | 重定向所有輸出到文本文件results.txt中,如果該文件已存在,輸出內(nèi)容將追加到該文件末尾。 |
- 使用命令行返回值
在命令行狀態(tài)下運行VSS時,VSS會設置一些返回值來標明運行狀態(tài)。你可以在批處理文件中根據(jù)VSS的返回值采取相應措施。
返回值 | 描述 |
100 | 表明出錯,例如:VSS無法找到數(shù)據(jù)庫文件,或者你試圖簽出某個早已被簽出的文件。 |
1 | 表明一個不是很嚴重的錯誤,將在如下三種情況下發(fā)生: 當你使用ss Dir時,沒有找到任何條目。 當你使用ss Status時,至少有一項被簽出。 當你使用ss Diff時,至少有一個文件不一致。 所有這些情況表明,即使本次操作是成功的,你執(zhí)行的下一個VSS命令也可能操作失敗。 |
0 | VSS成功執(zhí)行。 |
4.4.7 定制SS.INI和SRCSAFE.INI文件(Customize the SS.INI and SRCSAFE.INI Files)
VSS有兩類初始化文件,它們包含了VSS的一些環(huán)境變量:SS.INI,每個用戶都有一個這樣的文件;SRCSAFE.INI,僅有一個,定義了VSS 的一些全局變量,只有管理員才有權修改它。
附錄? 同時維護一個工程的多個版本(Maintain Multiple Versions of a Project)
你可以使用Share/Pin/Branch的方式,也可以使用Label方式。如果你所處的環(huán)境只要求少量的改動,比如:輕量級的patch,使用 Label比較合適;如果你正在規(guī)劃大量的開發(fā)內(nèi)容,使用Share/Pin/Branch比較合適。例如:在軟件處于Beta版時,你可以通過Label功能凍結(freeze)之,并同時修改Beta版的bug。當你正同時維護著某個產(chǎn)品的1.1版和2.0版時,合理的做法是,為每個版本創(chuàng)建一個新的工程, Share并Pin所有的文件,在需要的時候Branch。當1.1發(fā)布時,你可以將1.1版的工程Label,而后將對1.1版的改動重新Merge到2.0版中。下面的幾個場景為你使用Label功能提供指導:
場景1:理想情況
1、對即將到達Beta 1版的工程進行開發(fā)和測試。
2、當你認為時機適宜時,將之Label為"Beta 1"。
3、開始Beta 2版的工作。
場景2:文件A的某個版本被錯誤地包含在Beta 1版中
1、對即將到達Beta 1版的工程進行開發(fā)和測試。
2、當你認為時機適宜時,將之Label為"Beta 1"。
3、開始Beta 2版的工作。
4、如果發(fā)現(xiàn)文件A某一時期的版本被錯誤的包含在了Beta 1版中,選擇該文件的正確版本并Label為"Beta 1"。
5、獲取(Get)Beta 1 版的工程。
場景3:需將bug-fix后的文件A被包含在Beta 1版中,而其余文件未曾改動
1、對即將到達Beta 1版的工程進行開發(fā)和測試。
2、當你認為時機適宜時,將之Label為"Beta 1"。
3、開始Beta 2版的工作。
4、你發(fā)現(xiàn),包含在Beta 1版中文件A的那個版本存在bug,必須改正,而工程中的其余文件則不須改動。
5、簽出該文件,改正,然后簽入。
6、將工程重新Lable為"Beta 1"(你將被詢問是否確認刪除原有標記)。
場景4:需將bug-fix后的文件A包含在Beta 1版中,而其余文件也作了改動
1、對即將到達Beta 1版的工程進行開發(fā)和測試。
2、當你認為時機適宜時,將之Label為"Beta 1"。
3、開始Beta 2版的工作。
4、你發(fā)現(xiàn),包含在Beta 1版中文件A的那個版本存在bug,必須改正,而工程中的其余文件已經(jīng)改動過且已經(jīng)被簽入。
5、簽出該文件,改正,然后簽入(此時該文件的VSS內(nèi)部版本號將自動加1)。
6、將該文件Label為"Beta 1"(和工程的Label同名),這將使該文件的現(xiàn)有版本被指定為"Beta 1"。
場景5:文件A的一個原有版本需要進行bug-fix,并加入Beta 1版中
1、對即將到達Beta 1版的工程進行開發(fā)和測試。
2、當你認為時機適宜時,將之Label為"Beta 1"。
3、開始Beta 2版的工作。
4、你發(fā)現(xiàn),包含在Beta 1版中文件A的那個版本存在bug,必須改正。例如:文件的當前內(nèi)部版本號是6,且包含了為達到Beta 2版所做的某些改動,而你不希望將這些改動并入Beta 1版中。
5、簽出文件A(Version 6)
6、獲取Version 4,覆蓋Version 6的本地版本。
7、修改該文件Beta 1版中的bug,然后簽入。這將使文件A的內(nèi)部版本號升至7(Version 4的內(nèi)容加上bug-fix后的內(nèi)容,但沒有包含 Version 5和Version 6的內(nèi)容)
8、將Version 7 Label為"Beta 1"。這將使文件A的Version 7版被指定為"Beta 1"。現(xiàn)在,如果你嘗試獲取Beta 1版的工程時,你將會得到包含bug-fix后的文件A(被單獨Label)連同原來Label為"Beta 1"的工程中的其余文件。
9、為了繼續(xù) Beta 2版的工作,需要恢復在Version 5和Version 6上的改動,再次簽出文件A(Version 7)
10、獲取Version 6。
11、覆蓋Version 7的本地版本,或合并之(這將使本地版本變成Version 6的內(nèi)容加上你在Version 7中為"Beta 1"所做的bug-fix)。
12、繼續(xù)修改文件A的本地版本直到你滿意,然后簽入。這將產(chǎn)生文件A的Version 8,現(xiàn)在你將可以繼續(xù)Beta 2版的工作了。
附表 VSS中部分命令的對應權限級別
下表中打星號表示具有該類權限的用戶可以使用該命令。
功能 | R | C | A | D |
Add | ? | ? | * | * |
Branch | ? | ? | * | * |
Check In | ? | * | * | * |
Check Out | ? | * | * | * |
Cloak | * | * | * | * |
Create [1] | ? | ? | * | * |
Delete | ? | ? | * | * |
Destroy | ? | ? | ? | * |
Difference | * | * | * | * |
Get Latest Version | * | * | * | * |
History | * | * | * | * |
Label | ? | ? | * | * |
Links | * | * | * | * |
Merge [2] | ? | * | * | * |
Merge | * | * | * | * |
Move [3] | ? | ? | * | * |
Move | ? | ? | ? | * |
Pin | ? | * | * | * |
Purge | ? | ? | ? | * |
Recover | ? | ? | * | * |
Rename | ? | ? | * | * |
Rollback | ? | ? | ? | * |
Share [4] | ? | * | * | * |
Share | ? | ? | * | * |
Undo Check Out | ? | * | * | * |
Set Working Folder | * | * | * | * |
[1] 此處指用戶必須有對Parent Project的A類權限。
[2] 此處指用戶必須有對目的Project的C類權限,同時有對原Project的R類權限。
[3] 此處指用戶必須有對目的Parent Project的A類權限,同時有對原Parent Project的D類權限。
[4] 此處指用戶必須有對原 Project的C類權限,同時有對目的Project的A類權限。