VSS

1.setup environment variable: //指向ss.exe所在的路径
path=%path%;C:\Program Files\Microsoft Visual Studio\VSS\win32


2.指向VSS数据库的所在目录
set SSDIR=\\gqa-eric-lv\VSS\
set SSDIR=\\Guruvss\erp$\

3.登陆VSS:
ss CP -Yeric,eric123 -I- -s\\gqa-eric-lv\vss

4.获取任一目录的任一文件到本机(下例将$/ASP.Net/DataGridTest/index.aspx文件get到D:\tmp目录)
ss get -GLD:\tmp $/ASP.Net/DataGridTest/index.aspx
(ss get, -GLpath Copies a file to the specified folder, not to the current or working folder. )

5.分屏显示目录ASP.Net中的所有文件和文件夹(包括子文件):
ss dir $/ASP.Net -R|more (另外,有-I -V 两个参数,作用未知)

6.set Current Project:
ss cp $/SQL-sample

7.vss命令行是大小写不敏感的;命令行中的命令不需要全名,同sql一样,只要是可以识别的名字及可,如Dir就是directory的缩写;
(遵守UNC通用命名规则,Universal Naming Convention)

8.一些通用的命令行选项:
Option
Description

-C
为指定项(可以是多项)做注释 (Dir例外)

-O
重定向命令

-V
操作某项的指定版本

-R
Perform a command recursively.

-S
Turn SmartMode on or off for the command.

-G
Change the way the Get command works on any file retrieved to the local drive.

-W
指明本机副本是否只读(使用此参数,表示writable)

-N
在长短文件名两种模式间切换

-I-
任何环境下都不提示输入

-Y
指定用户名和密码

-?, -H
两个参数的作用都是获得在线的帮助

9.命令中有空格时,用双引号括起整个选项,如用ss CP "-Yeric Lv",eric123 而不用ss CP -Y"eric lv",eric123,

10.启动图形界面:ssexp -s\\gqa-eric-lv\vss

11.ss命令中,/表示VSS的当前目录,$/表示根目录,常用操作命令如下:
 ss Add TEST.C "My long filename.H" ,把TEST.C和"My long filename.H"两个文件添加到当前项目;
 ss Add -R *,把当前目录的所有文件及文件夹(包括子文件夹、文件)添加到当前项目;
 ss ADD -D- *.DLL,添加当前目录的所有DLL文件到当前项目,但不保留VSS上的历史文件(以节省空间);
 ss Checkout TEST.C TEST.H      Checkout当前项目中的两个文件
 ss Checkout $/TESTDATA/TEST.C Checkout指定项目中的文件
 ss Checkout -R $/TESTDATA      循环Check项目$/TESTDATA
 ss Comment TEST.C -V5      改变TEST.C的版本号为5的版本注释
 ss Comment TEST.C          改变TEST.C的最新版本的注释
 ss Comment $/TESTDATA      改变项目$/TESTDATA的注释
 ss Create $/WORD           VSS的根目录下,创建项目WORD
 ss Create WORD             VSS的当前目录下,创建项目WORD
 ss Cp $/WORD               设置$/WORD为Current Project
 ss Cp ..                   跳转到当前项目的父项目
 ss Delete $/PRJ/TEST.C     删除文件TEST.C (delete命令删除的文件,可以用直接add命令回复,如Add test.C)
 ss Delete $/PRJ            删除项目 (不可以有两个同名的文件被delete,因为没有真正删除)
 ss -S Delete *.*           删除所有文件,-S表示删除VSS上的文件之后,删除本机文件
 ss Destroy $/PRJ/TEST.C    持久删除文件(不可恢复)
 ss Destroy $/PRJ           持久删除项目


12.其他的更改操作有:label,merge,move,password,purge,recover,rename,rollback,share,undocheckout,workfold,branch等命令,这些命令会改变VSS数据库的内容或者环境。

13.VSS命令行中的比较/查找/显示等不改变数据库和环境的命令:   diff,dir,FileType,Get,help,history,links,paths,project,properties,status,view,whoami

14.显示最近的Version,Label信息:SS properties

15.显示Checkout的文件:SS Status

====================================================================
vss 命令行执行相关操作搜集整理

参考资料:
1.msdn;
2.http://blog.gameres.com/show.asp?BlogID=155&column=0
3.http://dev.csdn.net/article/51/article/52/52913.shtm

有时候,常常取固定的文件到固定的目录,每次鼠标操作很机械。最直接的想法便是,做成批处理文件。这就需要搜集到vss命令行执行的相关操作:

1.设置vss命令行程序ss.exe的路径:
PATH=%PATH%;X:\……\Microsoft Visual Studio\Common\VSS\win32

2.设置vss数据库的路径(注意):
set ssdir=\\cmserver\Project

3.设置vss的登录用户名:
set ssuser=yourAccount

4.设置vss的登录密码:
set sspwd=yourPwd

5.vss Check Out单个文件:
ss Checkout $/vssPath/fileName

6.vss Check In 单个文件:
ss checkin $/vssPath/fileName -C"your comment"

7.vss Undo Check Out单个文件:
ss Undocheckout $/vssPath/fileName

8.vss Check Out整个工程包含项目的所有子项目(子目录)(recursively):
ss Checkout $/vssPath/ -R

9.vss Check In 整个工程包含项目的所有子项目(子目录)(recursively):
ss checkin $/vssPath/* -R -C"your comment"

10.取单个文件最新版本:
ss Get $/vssPath/fileName

11.取整个工程到本地 :
ss Get $/vssPath/* -R

12.取vss服务器上的文件到指定地方(注意"-GL"后面没有空格!) :
ss get -GLX:\dest $/vssPath/fileName.txt

13.其他的更改操作有:label,merge,move,password,purge,recover,rename,rollback,share,undocheckout,workfold,branch等命令,这些命令会改变VSS数据库的内容或者环境。


14.VSS命令行中的比较/查找/显示等不改变数据库和环境的命令:   diff,dir,FileType,Get,help,history,links,paths,project,properties,status,view,whoami

15.显示最近的Version,Label信息:SS properties

16.显示Checkout的文件:SS Status


注意:
当执行命令行过程中,有提示输入“Y/N”时,可以在命令行中直接做成命令的参数,屏蔽问题。
-i-y 回答yes
-i-n 回答no

msdn上说到,当你在命令行界面下,使用像“get”,"check out" 这样的命令时,vss将把文件放置到你的当前目录,而不是像在窗口界面下一样,把相对应的文件放置在你设置的工作目录下。(现在,不明白的是,在命令行方式下,工作路径究竟有何用途?)

VSS does not, by default, change your current folder when you issue an ss CP command (change current project); nor does it change your project if you move from folder to folder. That is, the working folder has, by default, no effect on the command line and vice versa.

另外,对于执行类似于:
ss Get -GL"C:\Program Files\eclipse\workspace\abxx" $/kao_step3/abxx -R -i-y
语句时,好像对整个目录的文件都取了,而不管文件的版本号?
(现象是,执行起来,比在windows环境下对整个目录取最新版本要慢。)

 

 

 

 

 

最近工作需要将三四百个DLL文件汇入到VSS数据库中,并且一个个打上Label号,label号取的DLL的版本号(就是选中,点击鼠标邮件,属性里面可以看到的版本号),初步算了一下,这样几百个文件,一个Check out/Check in,再找到Label号,打上Label号,少说也要花上一两天的时间,这样实在是太慢了。下午希望能够通过在DotNet中编程来操作VSS数据库,于是查帮助文档,没有看到相关资料,倒是看到说VSS有命令行可以使用。于是网上搜了一下,也没看到几篇介绍VSS命令行的文章,还是看帮助文档吧,看了一个下午,一个晚上。再结合C#或者C/C++的使用,基本上以后可以实现自动Check Out/Check In并且自动打Label号了。简单总结了一下,下面是VSS的一些常用命令和操作:

1.setup environment variable: //指向ss.exe所在的路径
path=%path%;C:\Program Files\Microsoft Visual Studio\VSS\win32

2.指向VSS数据库的所在目录
set SSDIR=\\gqa-eric-lv\VSS\
set SSDIR=\\Guruvss\erp$\

3.登陆VSS:
ss CP -Yeric,eric123 -I- -s\\gqa-eric-lv\vss

4.获取任一目录的任一文件到本机(下例将$/ASP.Net/DataGridTest/index.aspx文件get到D:\tmp目录)
ss get -GLD:\tmp $/ASP.Net/DataGridTest/index.aspx
(ss get, -GLpath Copies a file to the specified folder, not to the current or working folder. )

5.分屏显示目录ASP.Net中的所有文件和文件夹(包括子文件):
ss dir $/ASP.Net -R|more (另外,有-I -V 两个参数,作用未知)

6.set Current Project:
ss cp $/SQL-sample

7.vss命令行是大小写不敏感的;命令行中的命令不需要全名,同sql一样,只要是可以识别的名字及可,如Dir就是directory的缩写;
(遵守UNC通用命名规则,Universal Naming Convention)

8.一些通用的命令行选项:
-C 为指定项(可以是多项)做注释 (Dir例外)
-O 重定向命令
-V 操作某项的指定版本
-R Perform a command recursively.
-S Turn SmartMode on or off for the command.
-G Change the way the Get command works on any file retrieved to the local drive.
-W 指明本机副本是否只读(使用此参数,表示writable)
-N 在长短文件名两种模式间切换
-I 任何环境下都不提示输入
-Y 指定用户名和密码
-?, -H 两个参数的作用都是获得在线的帮助

9.命令中有空格时,用双引号括起整个选项,如用ss CP "-Yeric Lv",eric123 而不用ss CP -Y"eric lv",eric123,

10.启动图形界面:ssexp -s\\gqa-eric-lv\vss

11.ss命令中,/表示VSS的当前目录,$/表示根目录,常用操作命令如下:
ss Add TEST.C "My long filename.H" ,把TEST.C和"My long filename.H"两个文件添加到当前项目;
ss Add -R *,把当前目录的所有文件及文件夹(包括子文件夹、文件)添加到当前项目;
ss ADD -D- *.DLL,添加当前目录的所有DLL文件到当前项目,但不保留VSS上的历史文件(以节省空间);
ss Checkout TEST.C TEST.H Checkout当前项目中的两个文件
ss Checkout $/TESTDATA/TEST.C Checkout指定项目中的文件
ss Checkout -R $/TESTDATA 循环Check项目$/TESTDATA
ss Comment TEST.C -V5 改变TEST.C的版本号为5的版本注释
ss Comment TEST.C 改变TEST.C的最新版本的注释
ss Comment $/TESTDATA 改变项目$/TESTDATA的注释
ss Create $/WORD VSS的根目录下,创建项目WORD
ss Create WORD VSS的当前目录下,创建项目WORD
ss Cp $/WORD 设置$/WORD为Current Project
ss Cp .. 跳转到当前项目的父项目
ss Delete $/PRJ/TEST.C 删除文件TEST.C (delete命令删除的文件,可以用直接add命令回复,如Add test.C)
ss Delete $/PRJ 删除项目 (不可以有两个同名的文件被delete,因为没有真正删除)
ss -S Delete *.* 删除所有文件,-S表示删除VSS上的文件之后,删除本机文件
ss Destroy $/PRJ/TEST.C 持久删除文件(不可恢复)
ss Destroy $/PRJ 持久删除项目

12.其他的更改操作有:label,merge,move,password,purge,recover,rename,rollback,share,undocheckout,workfold,branch等命令,这些命令会改变VSS数据库的内容或者环境。

13.VSS命令行中的比较/查找/显示等不改变数据库和环境的命令: diff,dir,FileType,Get,help,history,links,paths,project,properties,status,view,whoami

14.显示最近的Version,Label信息:SS properties

15.显示Checkout的文件:SS Status

Technorati : Microsoft, VSS

 

 

 

 

命令行中使用VSS
2006年11月29日 星期三 12:33
1.setup environment variable: //指向ss.exe所在的路径
path=%path%;C:\Program Files\Microsoft Visual Studio\VSS\win32

2.指向VSS数据库的所在目录
set SSDIR=\\gqa-eric-lv\VSS\
set SSDIR=\\Guruvss\erp$\

3.登陆VSS:
ss  CP -Yeric,eric123 -I- -s\\gqa-eric-lv\vss

4.获取任一目录的任一文件到本机(下例将$/ASP.Net/DataGridTest/index.aspx文件get到D:\tmp目录)
ss get -GLD:\tmp $/ASP.Net/DataGridTest/index.aspx
(ss get, -GLpath Copies a file to the specified folder, not to the current or working folder. )

5.分屏显示目录ASP.Net中的所有文件和文件夹(包括子文件):
ss dir $/ASP.Net -R|more (另外,有-I -V 两个参数,作用未知)

6.set Current Project:
ss cp $/SQL-sample

7.vss命令行是大小写不敏感的;命令行中的命令不需要全名,同sql一样,只要是可以识别的名字及可,如Dir就是directory的缩写;
(遵守UNC通用命名规则,Universal Naming Convention)

8.一些通用的命令行选项:

Option


Description

-C


为指定项(可以是多项)做注释 (Dir例外)

-O


重定向命令

-V


操作某项的指定版本

-R


Perform a command recursively.

-S


Turn SmartMode on or off for the command.

-G


Change the way the Get command works on any file retrieved to the local drive.

-W


指明本机副本是否只读(使用此参数,表示writable)

-N


在长短文件名两种模式间切换

-I-


任何环境下都不提示输入

-Y


指定用户名和密码

-?, -H


两个参数的作用都是获得在线的帮助
9.命令中有空格时,用双引号括起整个选项,如用ss  CP "-Yeric Lv",eric123 而不用ss  CP -Y"eric lv",eric123,

10.启动图形界面:ssexp  -s\\gqa-eric-lv\vss

11.ss命令中,/表示VSS的当前目录,$/表示根目录,常用操作命令如下:
 ss Add TEST.C "My long filename.H" ,把TEST.C和"My long filename.H"两个文件添加到当前项目;
 ss Add -R *,把当前目录的所有文件及文件夹(包括子文件夹、文件)添加到当前项目;
 ss ADD -D- *.DLL,添加当前目录的所有DLL文件到当前项目,但不保留VSS上的历史文件(以节省空间);
 ss Checkout TEST.C TEST.H      Checkout当前项目中的两个文件
 ss Checkout $/TESTDATA/TEST.C  Checkout指定项目中的文件
 ss Checkout -R $/TESTDATA      循环Check项目$/TESTDATA
 ss Comment TEST.C -V5      改变TEST.C的版本号为5的版本注释
 ss Comment TEST.C          改变TEST.C的最新版本的注释
 ss Comment $/TESTDATA      改变项目$/TESTDATA的注释
 ss Create $/WORD           VSS的根目录下,创建项目WORD
 ss Create WORD             VSS的当前目录下,创建项目WORD
 ss Cp $/WORD               设置$/WORD为Current Project
 ss Cp ..                   跳转到当前项目的父项目
 ss Delete $/PRJ/TEST.C     删除文件TEST.C (delete命令删除的文件,可以用直接add命令回复,如Add test.C)
 ss Delete $/PRJ            删除项目 (不可以有两个同名的文件被delete,因为没有真正删除)
 ss -S Delete *.*           删除所有文件,-S表示删除VSS上的文件之后,删除本机文件
 ss Destroy $/PRJ/TEST.C    持久删除文件(不可恢复)
 ss Destroy $/PRJ           持久删除项目


12.其他的更改操作有:label,merge,move,password,purge,recover,rename,rollback,share,undocheckout,workfold,branch等命令,这些命令会改变VSS数据库的内容或者环境。

13.VSS命令行中的比较/查找/显示等不改变数据库和环境的命令:   diff,dir,FileType,Get,help,history,links,paths,project,properties,status,view,whoami

14.显示最近的Version,Label信息:SS properties

15.显示Checkout的文件:SS Status

 

 

 

 

使用命令行操作VSS

一.        环境变量配置

1)        添加环境变量 名称为:Path;值为:VSS应用程序所在目录 例如:D:\Program files\Microsoft Visual Sourcesafe。

2)        添加环境变量 名称为:SSDIR 值为:VSS源代码数据库所在目录 例如:F:\SourceSafe。若VSS源代码数据库在局域网的其他电脑,则需要将VSS源代码文件夹设置共享文件夹,然后将SSDIR环境变量设置为:\\server\sourcesafe。

3)        命行中输入ss ,如果执行成功,则说明环境变量设置成功。

二.        SS命令使用

Ø 使用ss Get命令获得源代码

1)        在命令行中定位当前目录到想要下载源代码所在的目录。

2)        在命令行中执行 ss Get $/[project] –R,此命令会递归获得项目的完整代码 [project]替换VSS中的项目。

3)        在命令行中执行 ss Get [file],此命令可以获得当前项目中指定的文件 [file] 替换为VSS项目中的文件。

 

Ø 使用 ss Chekout命令签出源代码

1)        在命令行中执行 ss Checkout $/[project]/[file],此命令会将指项目的指定文件签出到当前命令行所在的目录。

2)        在命令行中执行 ss Checkout -R $/[project],此命令将会递归签出项目所有文件。

3)        在命令行中执行 ss Checkout [file1] [file2],此命令将可以同时签出多个文件。

Ø 使用 ss Checkin 命令签出源代码

1)        在命令行中执行 ss Checkin [file],此命令将可以指定的文件签入。

2)        在命令行中执行 ss Checkin * -P ,此命令将可以签入所有签出的文件。

 

 

----------------------------------------------------------------------------------------------------

VSS,即Visual Source Safe,是微软公司开发的Windows平台上优秀的Source版本控制器。不同于CVS的是,它不是开源,因此支持VSS的只有Windows平台。但微软发布了VSS的API。任何开发者都可以通过ssapi.dll文件,开发自定义的VSS插件或其他工具。Ssapi.dll是ActiveX组件,自然能支持多种开发语言。但想要支持Java,就得使用JNI了。
本文使用JNI实现访问VSS的Java api。
1.VSS Java API

定义VSS Java API。

package org.colimas.scm.vss;

/**
 * VSS Operator class that will call native method.
 * @author tyrone
 *
 */
public class VSSOperator {

     private static String LIBPATH="vssperator.dll";

     public static String ROOT="$/";
     /**
      * load dll
      *
      */
     public VSSOperator(){
       String path=Thread.currentThread().getContextClassLoader().getResource("./").getPath();
       path=path+LIBPATH;
       System.load(path);
     }
     /**
      * load dll
      *
      */
     public VSSOperator(String libPath){
       System.load(libPath);
     }
     /**
      * Connect to VSS
      * @param path srcsafe.ini file path.
      * @param id   user id
      * @param pass password
      * @return
      */
     public native boolean connection(String path,String id,String pass);
     /**
      * disconnect from VSS
      *
      */
     public native void disconnection();
     /**
      * get current project.
      * @return
      */
     public native String getCurrentProject();
     /**
      * get database name
      * @return
      */
     public native String getDatabaseName();
     /**
      * get item names from specified path.
      * @param path
      * @return
      */
     public native String[] getItemNames(String path);
     /**
      * get specified file(s) from VSS to local.
      * @param itemName
      * @param localPath
      * @param flag
      * @return
      */
     public native boolean getFile(String itemName,String localPath,int flag);

     /**
      * get specified version of one file from VSS to local.
      * @param itemName
      * @param localPath
      * @param version
      * @param flag
      * @return
      */
     public native boolean getVersion(String itemName,String localPath,int version,int flag);
     /**
      * checkout specified file(s) from vss to local.
      * @param itemName
      * @param localPath
      * @param comment
      * @param flag
      * @return
      */
     public native boolean checkout(String itemName,String localPath,String comment,int flag);
     /**
      * check file(s) in VSS
      * @param itemName
      * @param localPath
      * @param comment
      * @param flag
      * @return
      */
     public native boolean checkin(String itemName,String localPath,String comment,int flag);
     /**
      * undo check out action
      * @param itemName
      * @param localPath
      * @param flag
      * @return
      */
     public native boolean undoCheckout(String itemName,String localPath,int flag);
}

每个native方法都由VC++实现。

2.VSS的API
CodeProject网站上有一些VSS API的相关文章,本文借鉴了下面link的内容。http://www.codeproject.com/samples/SSBrowser.asp
从该网站上下载source,内有一个头文件ssauto.h是访问VSS API的关键。该文件定义了VSSAPI涉及到的所有接口,本文使用的接口有:
IVSSDatabase:VSS数据库接口。该接口负责创建连接和获得IVSSItem。
IVSSItem:VSS内的某个文件或工程,该接口负责返回文件或项目信息,Checkout,Checkin,获得文件等。
IVSSItems:VSS内某些文件或工程,IVSSItem集合。


3.Native方法实现

3.1 搭建开发环境

3.1.1.使用javah命令生成JNI的头文件。
D:/ >javah -classpath ./;D:/MyProject/colima
s/ra/SCMResources/bin/classes org.colimas.scm.vss.VSSOperator
生成一个叫org_colimas_scm_vss_VSSOperator.h的文件。

3.1.2.创建VC++的Dynamic Link Library支持MFC的工程。将org_colimas_scm_vss_VSSOperator.h文件和ssauto.h文件添加到工程内。
3.1.3.在StdAfx.h头文件加入:
#include "ssauto.h"
#include <atlbase.h>
#include <comdef.h>
extern "C" const GUID __declspec(selectany) LIBID_SourceSafeTypeLib =
 {0x783cd4e0,0x9d54,0x11cf,{0xb8,0xee,0x00,0x60,0x8c,0xc9,0xa7,0x1f}};
extern "C" const GUID __declspec(selectany) IID_IVSSItem =
 {0x783cd4e1,0x9d54,0x11cf,{0xb8,0xee,0x00,0x60,0x8c,0xc9,0xa7,0x1f}};
extern "C" const GUID __declspec(selectany) IID_IVSSItems =
 {0x783cd4e5,0x9d54,0x11cf,{0xb8,0xee,0x00,0x60,0x8c,0xc9,0xa7,0x1f}};
extern "C" const GUID __declspec(selectany) IID_IVSSDatabase =
 {0x783cd4e2,0x9d54,0x11cf,{0xb8,0xee,0x00,0x60,0x8c,0xc9,0xa7,0x1f}};
extern "C" const GUID __declspec(selectany) CLSID_VSSItem =
 {0x783cd4e3,0x9d54,0x11cf,{0xb8,0xee,0x00,0x60,0x8c,0xc9,0xa7,0x1f}};
extern "C" const GUID __declspec(selectany) CLSID_VSSDatabase =
 {0x783cd4e4,0x9d54,0x11cf,{0xb8,0xee,0x00,0x60,0x8c,0xc9,0xa7,0x1f}};
extern "C" const GUID __declspec(selectany) IID_IVSS =
 {0x783cd4eb,0x9d54,0x11cf,{0xb8,0xee,0x00,0x60,0x8c,0xc9,0xa7,0x1f}};

//并为一些接口定义智能指针
_COM_SMARTPTR_TYPEDEF(IVSSItem, IID_IVSSItem);
_COM_SMARTPTR_TYPEDEF(IVSSItems, IID_IVSSItems);

3.1.4.在Option的Directory内加入JDK include和include/win32路径。

3.2 方法实现

在VC++源程序内加入
#include "org_colimas_scm_vss_VSSOperator.h"
并定义全局变量。

IVSSDatabase *pVdb;
IClassFactory *pClf;
3.2.1 connection方法实现
JNI定义为
JNIEXPORT jboolean JNICALL Java_org_colimas_scm_vss_VSSOperator_connection
(JNIEnv *env, jobject, jstring VSSini, jstring User, jstring Password)
在注册表中查找VSS API组件
  CLSIDFromProgID(L"SourceSafe", &clsid )
     //实例化类工厂。
  CoGetClassObject( clsid, CLSCTX_ALL, NULL,
   IID_IClassFactory, (void**)&pClf )
     //实例化IVSSDatabase
  pClf->CreateInstance( NULL, IID_IVSSDatabase,
     (void **) &pVdb )
     //创建一个VSS连接。
pVdb->Open(bstrPath, bstrUName, bstrUPass)
代码如下:
JNIEXPORT jboolean JNICALL Java_org_colimas_scm_vss_VSSOperator_connection
(JNIEnv *env, jobject, jstring VSSini, jstring User, jstring Password)
{
//将参数转换为C++基本类型。
     const unsigned short * psz_VSSini=env->GetStringChars(VSSini, 0);
     const unsigned short * psz_User=env->GetStringChars(User, 0);
     const unsigned short * psz_Password=env->GetStringChars(Password, 0);
//再将这些变量转化为COM能识别的类型。
  BSTR bstrPath = SysAllocString(psz_VSSini);
  BSTR bstrUName = SysAllocString(psz_User);
  BSTR bstrUPass = SysAllocString(psz_Password);
     CLSID clsid;
     jboolean result=JNI_FALSE;
  CoInitialize(0);
  if(S_OK == CLSIDFromProgID(L"SourceSafe", &clsid ))
  {
    if(S_OK == CoGetClassObject( clsid, CLSCTX_ALL, NULL,
   IID_IClassFactory, (void**)&pClf ))
    {
   if(S_OK == pClf->CreateInstance( NULL, IID_IVSSDatabase,
     (void **) &pVdb ))
   {
     if(S_OK == pVdb->Open(bstrPath, bstrUName, bstrUPass))
     {
#ifdef _DEBUG
     AfxMessageBox("Open successfully",MB_OK,0);
#endif
             result=JNI_TRUE;
     }else{
#ifdef _DEBUG
             AfxMessageBox("Open failed",MB_OK,0);
#endif
          }
   }else
        {
             AfxMessageBox("Init failed",MB_OK,0);
        }
    }
  }else
      {
            AfxMessageBox("You didnot install VSS yet",MB_OK,0);
      }
  //CoUninitialize();

  SysFreeString(bstrPath);
  SysFreeString(bstrUName);
  SysFreeString(bstrUPass);
      return result;
}
3.2.2 disconnectin实现

JNIEXPORT void JNICALL Java_org_colimas_scm_vss_VSSOperator_disconnection
(JNIEnv *, jobject)
{
     pVdb->Release();
     pClf->Release();
     CoUninitialize();
#ifdef _DEBUG
     AfxMessageBox("Close successfully",MB_OK,0);
#endif
}

3.2.3 getDatabaseName和getCurrentProject实现

JNIEXPORT jstring JNICALL Java_org_colimas_scm_vss_VSSOperator_getDatabaseName
(JNIEnv * env, jobject)
{
     if(pVdb==NULL)
       return NULL;
     CComBSTR bstrDatabase;
//调用IVSSDatabase方法
     if(S_OK==pVdb->get_DatabaseName(&bstrDatabase))
     {
       return env->NewString(bstrDatabase,bstrDatabase.Length());
     }else{
#ifdef _DEBUG
     AfxMessageBox("Get DB failed",MB_OK,0);
#endif
       return NULL;
     }
}

/*
 *Get current project in vss
 */
JNIEXPORT jstring JNICALL Java_org_colimas_scm_vss_VSSOperator_getCurrentProject
(JNIEnv *env, jobject)
{
     if(pVdb==NULL)
       return NULL;
     CComBSTR bstrProject;
//调用IVSSDatabase方法
     if(S_OK==pVdb->get_CurrentProject(&bstrProject))
     {

       return env->NewString(bstrProject,bstrProject.Length());
     }else
       return NULL;
}

3.2.4 getFile实现

JNIEXPORT jboolean JNICALL Java_org_colimas_scm_vss_VSSOperator_getFile
(JNIEnv *env, jobject, jstring itemName, jstring localPath, jint flag)
{
     jboolean result=JNI_FALSE;
     if(pVdb==NULL)
       return result;
     IVSSItemPtr vssRootItem;
     const unsigned short * lpath=env->GetStringChars(itemName,0);
     const unsigned short * llocalPath=env->GetStringChars(localPath,0);
//获得Item实例
     if(pVdb->get_VSSItem(CComBSTR(lpath), FALSE, &vssRootItem)==S_OK)
     {
//获得文件,并将文件下载到本地目录。
       if(vssRootItem->Get(&CComBSTR(llocalPath),flag)==S_OK)
       {
            result=JNI_TRUE;
       }
     }
     return result;
}

3.2.5 getItemNames实现

JNIEXPORT jobjectArray JNICALL Java_org_colimas_scm_vss_VSSOperator_getItemNames
(JNIEnv *env, jobject, jstring path)
{
     if(pVdb==NULL)
       return NULL;
     jobjectArray nameArray;
     IVSSItemPtr vssRootItem;
     const unsigned short * lpath=env->GetStringChars(path,0);
//获得父Item。
     if(pVdb->get_VSSItem(CComBSTR(lpath), FALSE, &vssRootItem)==S_OK)
     {
//获得所有子Item集合
       IVSSItemsPtr vss_items;
       if(vssRootItem->get_Items(_variant_t(false), &vss_items)==S_OK)
       {
            long l_count;
            CComBSTR name;
//获得子Item个数
            vss_items->get_Count(&l_count);
            nameArray=env->NewObjectArray(l_count,env->FindClass("java/lang/String"),env->NewStringUTF(""));
//遍历
            for (long i = 0; i < l_count; i++)
            {
              IVSSItemPtr vss_ChildItem;
//获得子Item
              if(vss_items->get_Item(_variant_t(i+1L), &vss_ChildItem)==S_OK)
              {
//获得子Item名称
                   vss_ChildItem->get_Name(&name);
                   jstring jname=env->NewString(name,name.Length());
                   env->SetObjectArrayElement(nameArray,i,jname);
              }else
                   break;
            }
       }
     }
     return nameArray;
}

3.2.6 getVersion实现

JNIEXPORT jboolean JNICALL Java_org_colimas_scm_vss_VSSOperator_getVersion
(JNIEnv *env, jobject, jstring itemName, jstring localPath, jint version,jint flag)
{
     jboolean result=JNI_FALSE;
     if(pVdb==NULL)
       return result;
     IVSSItemPtr vssRootItem;
     const unsigned short * lpath=env->GetStringChars(itemName,0);
     const unsigned short * llocalPath=env->GetStringChars(localPath,0);
//获得Item实例
     if(pVdb->get_VSSItem(CComBSTR(lpath), FALSE, &vssRootItem)==S_OK)
     {
       IVSSItemPtr vss_oldItem;
       //long l_version=version;
//获得该Item某个版本实例
       if(vssRootItem->get_Version(_variant_t(version), &vss_oldItem)==S_OK){
//下载到本地。
            if(vss_oldItem->Get(&CComBSTR(llocalPath),flag)==S_OK)
            {
              result=JNI_TRUE;
            }
       }
     }
     return result;
}

3.2.7 checkout实现

JNIEXPORT jboolean JNICALL Java_org_colimas_scm_vss_VSSOperator_checkout
(JNIEnv *env, jobject , jstring itemName, jstring localPath, jstring comment,jint flag)
{
     jboolean result=JNI_FALSE;
     if(pVdb==NULL)
       return result;
     IVSSItemPtr vssRootItem;
     const unsigned short * lpath=env->GetStringChars(itemName,0);
     const unsigned short * l_localPath=env->GetStringChars(localPath,0);
     const unsigned short * l_comment=env->GetStringChars(comment,0);
     //获得Item实例
     if(pVdb->get_VSSItem(CComBSTR(lpath), FALSE, &vssRootItem)==S_OK)
     {
//checkout到本地目录
       if(vssRootItem->Checkout(CComBSTR(l_comment),CComBSTR(l_localPath),flag)==S_OK)
       {
            result=JNI_TRUE;
       }else
            AfxMessageBox("checked it out fail",MB_OK);
     }

     return result;
}

3.2.8 checkin实现

JNIEXPORT jboolean JNICALL Java_org_colimas_scm_vss_VSSOperator_checkin
(JNIEnv *env, jobject, jstring itemName, jstring localPath, jstring comment, jint flag)
{
     jboolean result=JNI_FALSE;
     if(pVdb==NULL)
       return result;
     IVSSItemPtr vssRootItem;
     const unsigned short * lpath=env->GetStringChars(itemName,0);
     const unsigned short * l_localPath=env->GetStringChars(localPath,0);
     const unsigned short * l_comment=env->GetStringChars(comment,0);
//获得Item实例
     if(pVdb->get_VSSItem(CComBSTR(lpath), FALSE, &vssRootItem)==S_OK)
     {
//checkin
       if(vssRootItem->Checkin(CComBSTR(l_comment),CComBSTR(l_localPath),flag)==S_OK)
       {
            result=JNI_TRUE;
       }else
       {
            AfxMessageBox("checked it in fail",MB_OK);
       }
     }

     return result;
}


3.2.9 undoCheckout实现

JNIEXPORT jboolean JNICALL Java_org_colimas_scm_vss_VSSOperator_undoCheckout
(JNIEnv *env, jobject, jstring itemName, jstring localPath, jint flag)
{
     jboolean result=JNI_FALSE;
     if(pVdb==NULL)
       return result;
     IVSSItemPtr vssRootItem;
     const unsigned short * lpath=env->GetStringChars(itemName,0);
     const unsigned short * l_localPath=env->GetStringChars(localPath,0);
//获得Item实例

     if(pVdb->get_VSSItem(CComBSTR(lpath), FALSE, &vssRootItem)==S_OK)
     {
//undo
       if(vssRootItem->UndoCheckout(CComBSTR(l_localPath),flag)==S_OK)
       {
            result=JNI_TRUE;
       }else
            AfxMessageBox("undochecked it out fail",MB_OK);
     }
     return result;
}


4.测试

VSS API用到一些Flag。我将他们定义到Java接口文件内。Flag的具体作为不做叙述。
package org.colimas.scm.vss;
/**
 *@authortyrone
 *
 */
publicinterface VSSFlag {
 publicintVSSFLAG_USERRONO = 1;
 publicintVSSFLAG_USERROYES = 2;
 publicintVSSFLAG_TIMENOW = 4;
 publicintVSSFLAG_TIMEMOD = 8;
 publicintVSSFLAG_TIMEUPD = 12;
 publicintVSSFLAG_EOLCR = 16;
 publicintVSSFLAG_EOLLF = 32;
 publicintVSSFLAG_EOLCRLF = 48;
 publicintVSSFLAG_REPASK = 64;
 publicintVSSFLAG_REPREPLACE = 128;
 publicintVSSFLAG_REPSKIP = 192;
 publicintVSSFLAG_REPMERGE = 256;
 /**
  *Specifiesafulltextcomparison.
   *UsethisflagwiththeCheckin,Get,orUndoCheckoutmethodstocomparethetextcontentsofthelocalcopyandtheSourceSafemastercopy.Ifthelocalcopyisup-to-date,SourceSafedoesnotreplaceitwiththemastercopy.
  */
 publicintVSSFLAG_CMPFULL = 512;
 /**
  *Specifiesatimestampcomparison.
   *UsethisflagwiththeCheckin,Get,orUndoCheckoutmethodstocomparedate/timestampofthelocalcopyandtheSourceSafemastercopy.Ifthelocalcopyisup-to-date,SourceSafedoesnotreplaceitwiththemastercopy.
  */
 publicintVSSFLAG_CMPTIME = 1024;
 publicintVSSFLAG_CMPCHKSUM = 1536;
 /**
  *Specifiesnocomparisonmechanism.
   *UsethisflagwiththeCheckin,Get,
   *orUndoCheckoutmethodstoalwaysreplacethelocalcopywiththeSourceSafemastercopy.
  */
 publicintVSSFLAG_CMPFAIL = 2048;
 /**
  *Indicatesthatacommandshouldnotberecursive(actonanentireprojecttree).Thisisthedefault.
  */
 publicintVSSFLAG_RECURSNO = 4096;
 /**
  *Indicatesthatacommandshouldberecursive(actonanentireprojecttree).
   *UsethisflagwiththeCheckin,Checkout,Get,orSharemethods.
  */
 publicintVSSFLAG_RECURSYES = 8192;
 /**
  *Usedtooverridetheworkingfolderspecifications.
  */
 publicintVSSFLAG_FORCEDIRNO = 16384;
 /**
  *Usedtomaintaintheworkingfoldersettings.Thisisthedefault.
  */
 publicintVSSFLAG_FORCEDIRYES = 32768;
 publicintVSSFLAG_KEEPNO = 65536;
 publicintVSSFLAG_KEEPYES = 131072;
 /**
  *Indicateswhetherthelocalcopyshouldbedeleted
  *afteranAdd,Checkin,orUndoCheckout.
  */
 publicintVSSFLAG_DELNO = 262144;
 /**
  *Indicatesthatthelocalcopyofafileisdeletedwhenitischeckedin.
  */
 publicintVSSFLAG_DELYES = 524288;
 /**
  *IndicatesthatthelocalcopyofafileisnotreplacedbyanUndoCheckoutoperation.
   *Whenthisflagisset,thelocalcopyisnotreplacedwiththeSourceSafemastercopyanditsread-onlyflagissettotrue.
  */
 publicintVSSFLAG_DELNOREPLACE = 786432;
 /**
  *IndicatesthatVisualSourceSafeauto-detectsthefiletodeterminewhetheritistextorbinary.
  */
 publicintVSSFLAG_BINTEST = 1048576;
 /**
  *Indicatesthatafileisbinary.
   *      Whenthisflagisset,SourceSafesetstheaddedfiletypetobinary.
  */
 publicintVSSFLAG_BINBINARY = 2097152;
 /**
  *Indicatesthatafileistext.
  */
 publicintVSSFLAG_BINTEXT = 3145728;
 /**
  *Indicatesthatanaddedfileretainsitshistoricalversions.
  */
 publicintVSSFLAG_DELTAYES = 4194304;
 /**
  *Indicatesthatanaddedfiledoesnotretainitshistoricalversions.
  */
 publicintVSSFLAG_DELTANO = 8388608;
 publicintVSSFLAG_UPDASK = 16777216;
 publicintVSSFLAG_UPDUPDATE = 33554432;
 publicintVSSFLAG_UPDUNCH = 50331648;
 /**
  *IndicatesthatthelocalcopyshouldbereplacedwiththeSourceSafemastercopyoncommandsthatdoanautomaticGet.
  */
 publicintVSSFLAG_GETYES = 67108864;
 /**
  *IndicatesthatthelocalcopyshouldnotbereplacedwiththeSourceSafemastercopyoncommandsthatdoanautomaticGet.
  */
 publicintVSSFLAG_GETNO = 134217728;

 /**
  *Indicatesthatacheckoutisexclusive.
  *SourceSafeallowsthefilestobecheckedoutbymorethanoneuser.
  */
 publicintVSSFLAG_CHKEXCLUSIVEYES = 268435456;
 /**
  *Indicatesthatacheckoutisnon-exclusive.Multiplecheckoutsareallowedwiththisoption.
  *SourceSafeallowsthefilestobecheckedoutbymorethanoneuser.
  */
 publicintVSSFLAG_CHKEXCLUSIVENO = 536870912;
 publicintVSSFLAG_HISTIGNOREFILES = 1073741824;
}

 

使用JUNIT编写测试用例如下:
package org.colimas.scm.vss;

import junit.framework.TestCase;

publicclass VSSOperatorTest extends TestCase {

  private VSSOperator op=new VSSOperator("D:/MyProject/colimas/ra/vssperator/debug/vssperator.dll");
  String path="c://vssdb//srcsafe.ini";
  String id="id";
  String pass="pass";
  String itemName="$/test";
  String localPath="d:/test/";
  publicvoid testGetFile() {
    assertEquals(op.connection(path, id, pass),true);
    assertEquals(op.getFile(itemName, localPath, 0),true);
    op.disconnection();
  }

  publicvoid testGetVersion() {
    assertEquals(op.connection(path, id, pass),true);
    assertEquals(op.getVersion("$/ImageConfirm/Main.bas", localPath, 14,0),true);
    op.disconnection();
  }

  publicvoid testCheckout() {
    assertEquals(op.connection(path, id, pass),true);
    assertEquals(op.checkout(itemName, localPath, "checkout",0),true);
    op.disconnection();
  }

  publicvoid testCheckin() {
    assertEquals(op.connection(path, id, pass),true);
    assertEquals(op.checkout(itemName, localPath, "checkout",0),true);
    op.disconnection();
    assertEquals(op.connection(path, id, pass),true);
    assertEquals(op.checkin(itemName, localPath, "checkout",0),true);
    op.disconnection();
  }

  publicvoid testUndoCheckout(){
    assertEquals(op.connection(path, id, pass),true);
    assertEquals(op.checkout(itemName, localPath, "checkout",0),true);
    op.disconnection();

    assertEquals(op.connection(path, id, pass),true);
    assertEquals(op.undoCheckout(itemName, localPath,0),true);
    op.disconnection();
  }
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
VSS概述 Microsoft Visual SourceSafe是美国微软公司出品的版本控制系统,简称VSS。它提供了还原点和并行协作功能,从而使应用程序开发组织能够同时处理软件的多个版本。该版本控制系统引入了签入和签出模型,按照该模型,单个开发人员可以签出文件,进行修改,然后重新签入该文件。当文件被签出后,其他开发人员通常无法对该文件进行更改。通过源代码管理系统,开发人员还能够回滚或撤消任何随后产生问题的更改。 作为一种版本控制系统,Visual SourceSafe 能够: • 防止用户无意中丢失文件。 • 允许回溯到以前版本的文件。 • 允许分支、共享、合并和管理文件版本。 • 跟踪整个项目的版本。 • 跟踪模块化代码(一个由多个项目重用或共享的文件)。 独立开发人员和小型开发团队已经发现,版本控制能够使他们保持内心的宁静并提高工作效率,从而使他们受益。Visual SourceSafe 是一种版本控制产品,主要致力于维护文件更改历史记录、审核跟踪日志以及对源代码文件进行灾难恢复。它在以下场合下最为有效:团队的规模较小,各个成员之间的地理距离比较近,通常在高度可靠的环境中通过高速、低延迟的局域网 (LAN) 工作,并且共享的开发资产不大可能超过 4 GB。Visual SourceSafe 是一种仅用于客户端的文件服务器应用程序,不需要服务器端处理或代码执行。 1.1 VSS中的文件 当你要修改某个文档时,需要先从数据库中将它签出(check out),或者告诉VSS你要编辑该文档。VSS会将该文档的副本从数据库中拿到你的工作文件夹(working folder)中,你就可以修改你的文档了。如果其他用户再想对同一文档进行修改,VSS会产生一个信息,告诉他,该文档已被签出(check out),从而避免多人同时修改文档,以保证文档的安全性。 当你完成修改之后,需要将文档 签入(check in)VSS。这个操作从你的工作文件夹(working folder)中复制被你修改的文档,并将它放回VSS数据库,以便其他用户能够及时看到文档的改动。VSS能够保存文档的所有改动,并显示最新版本,同时早期版本也会被跟踪记录下来。VSS对反增量技术的运用,仅需要用很少的磁盘空间就能使得用户获取文档的所有版本。 如果你没有修改文档,你可以执行撤消签出(undo check out)命令,文档将被保存为被签出(check out)之前的状态。 如果你只需读取某一文档而并不需要编辑它,你可以执行取出(get)命令,将文档放入你的工作文件夹,再选择查看文档(view),来查看你的文档的最新版本。 1.2 VSS中的项目 项目(project)是指用户存储在VSS数据库中的所有文件(file)的集合。用户可以在项目之间或项目内部实现文件的添加(add)、删除(delete)、编辑(edit)、共享(share)。一个“项目(project)”在很大程度上类似于一个普通系统的的文件夹,不同的是它能更好地支持文件合并(merge)、跟踪(archive)和版本控制(version control)功能。 文件保存在VSS数据库中的项目(project)里。你无须管理存储在VSS 中的文件正本,除非你要检查或与其它拷贝进行比较。 VSS为每一位用户提供了一份备份文件放入工作文件夹(working folder),供用户对文件进行查看与编辑。尽管没有工作文件夹也可以查看文件,但要想真正实现对文档的处理,必须建立工作文件夹。 1.3 VSS的版本控制功能 VSS能够保存文件的多个版本,包括文件版本之间每一处微小的变动。版本控制有以下几方面的内容: l 组内合作——在缺省的情况下,一般一个文件在某一时间只允许一个用户对其进行修改,这样可以防止文件意外地被其他用户改动或者覆盖。但管理员可以改动这种缺省的设置,允许文件多层签出。这种设置也能防止过多的、不必要的改动。 l 版本追踪——VSS能够对源代码和其他文件进行存储和早期版本的追踪,从而实现重建文件早期版本等有关功能。 l 跨平台开发——在多平台开发的情况下,版本追踪用于维护核心代码。 l 代码的再使用—— 追踪程序基准使得代码可重用。 1.4 文件的拆分和共享 在VSS中可以实现一个文件被多个项目共享(share)。在一个项目中对文件的改动可以自动反映到其他共享的项目中去。这正提倡了代码重用。在file菜单中的properties中,点击link,可以查看某一文件的共享情况。 拆分(branch)是将文件从原来共享的项目中分离出来的过程。它使得VSS可以实现从不同的路径追踪文件。 注:在其他版本控制系统中,分支是通过跟踪版本号来实现的。例如:版本“2.3.9.2”是版本2.3的第二个修订版本的第九个分支。而VSS通过明显不同的项目名称实现对文件分支的跟踪。 拆分文件就断开了共享连接,使得本项目中的文件与其他原来共享的项目无关。对此文件的修改将不会再反映到其他项目上。拆分是这样被建立的:两个文件以前有着共同的历史记录,从实现拆分开始,他们的历史记录将被VSS分别追踪。 拆分文件之后,link按纽将不再显示已断开的连接,但你可以用path(file菜单中的properties项)按纽浏览拆分的历史记录。 共享(share)文件就是在多个项目间建立文件的连接。拆分(branch)文件就是在项目之间建立了不同的文件路径。 1.5 工作文件夹(working folder) VSS是存储和管理文件的工具,但是编辑和编译文件必须在VSS指定文件夹中进行。这个文件夹叫工作文件夹,它可以是现存的文件夹,也可以是VSS新建的文件夹。VSS浏览器在文件列表上方显示了文件的工作文件夹的路径。 在VSS系统中,工作文件夹才是你真正用于处理文档的地方。当你要编辑或修改某个文档时,必须对文档实施check out 操作(详见3.3.5修改和编辑文件),VSS将该文档从项目中拷贝出来,放入你的工作文件夹。当你修改完毕并check in 文件之后,VSS又将文件重新拷贝到数据库中以记录你的修改。 一旦你将文件签出,VSS就开始在你的本地机上创建并管理你的工作文件夹。 每一个用户、每一个项目或每一台微机都可以有自己的工作文件夹。如果Joe在项目$/SpreadSheet和$/WordProcessor上工作,他就有相应的2个不同的工作文件夹。如果Hanna在同样的项目上工作,对于每一个项目她又有自己的工作文件夹。 当你为某个项目设置了工作文件夹,你可以用它来放置你该项目中包括子项目再内的所 VSS服务器端安装 Visual SourceSafe 管理员通常将 Visual SourceSafe 安装到网络服务器上,然后将您的名称添加到数据库用户列表中。只需运行安装程序,然后选择某个选项以安装 Visual SourceSafe。 1 有三个 Visual SourceSafe 安装选项: 1)数据库服务器 将数据库和所需的软件安装到网络服务器上(系统管理员使用该选项)。然后,各个用户使用 Netsetup 从网络服务器安装 Visual SourceSafe 客户程序。 2)自定义 允许您选择要安装的组件。 3)独立 安装创建和访问您的计算机上专用数据库所需的组件。另外,还可以连接到网络服务器上的现有数据库中。 2 指派用户权限 在可以访问数据库之前,必须指派相应的权限。另外,还可以将用户权限指派给其他要共享您的数据库中文件的小组成员。请 Visual SourceSafe 系统管理员添加、更改或删除数据库的用户权限和密码。 3 连接到 Visual SourceSafe 数据库 从 Visual SourceSafe 应用程序连接到 Visual SourceSafe 数据库,启动 Visual SourceSafe 应用程序。 从“文件”菜单中,单击“打开 SourceSafe 数据库”,然后在列表框中选择一个数据库。 可以使用此命令从其他人已经创建的 Visual SourceSafe 项目中选择一个现有的数据库。这样您就可以使用由他人建立的多开发人员项目了。 2 VSS的客户端安装 从网络安装VSS客户端 1)打开本地计算机的“网上邻居”属性对话框; 2)点击“配置”按纽; 3)将“MICROSOFT网络用户”的属性设置为:登录到WINDOWS NT 域,域名为PLANNING; 4)添加TCP/IP、NETBEUI、IPX/SPX协议; 5)重新启动计算机,登录“planning”域; 注:管理员为每位NT用户设置的登录密码为“111”,用户在第一次登录时,计算机会提示用户修改密码。 6)从“网上邻居”的“planning”域中查找服务器“VSSDATA”; 7)打开共享的“VSS”文件夹并双击“NETSETUP”; 8)按照安装程序的提示开始安装。 3 VSS的基本使用操作 3.1 登录VSS 点击VSS图标或从程序菜单中运行Visual SourceSafe 6.0,即可打开VSS浏览器。 如果用户登录的VSS密码和登录PLANNING域的密码是一致的,系统将不再提示输入进入VSS数据库的密码;如果用户为VSS设置的密码与登录PLANNING域的密码不同,系统将提示用户输入VSS的登录密码。关于如何修改VSS用户密码,详见“3.2.14修改用户密码”。 3.2 VSS浏览器 当你一打开VSS,如果你设定了密码的话,它会提示你输入密码。如果你没有设定密码,你可以直接看到浏览器。在浏览器上,你可以浏览你的数据库、查看项目列表、显示文件统计信息、执行命令对文件和项目进行操作等。浏览器的最上方的标题栏是你当前连接的数据库。VSS使用符号来提供有关文件和项目信息。 菜单栏的下面是常用工具栏,这里有许多常用命令的按纽,它可以帮你快速地执行对文件的操作。 在项目栏中,显示有项目列表,包括特殊项目的有关信息。文件栏显示了当前项目的所有文件的列表。结果栏显示当前你所执行的操作的结果。 3.3 VSS基本操作 3.3.1创建新的文件夹 1) 选中要创建新文件夹的项目(上级文件夹); 2) 在file菜单中选中creat project; 3) 写入要添加的文件夹的名称,同时也可以在comment栏中为新建的文件夹添加备注; 4) 点击OK。 3.3.2添加文件夹 1) 选中你要添加文件夹的项目(上级文件夹); 2) 在file菜单中选中add files; 3)在文件夹列表中选中要添加的文件夹; 4)点击add,同时可以在comment栏为你添加的文件夹做一个简单备注; 5)如果你要连同子文件夹一起添加,选择Recursive; 5) 点击OK,成功添加了一个带有备注的文件夹。或者点击close,退出操作,返回add files对话框,点击close。 3.3.3添加文件 3.3.2.1使用add命令添加文件 1)选中你要添加文件的文件夹; 2) 在fil菜单中选中add files; 3) 在文件列表中选中要添加的文件;如果要添加多个文件,可以使用CTRL键或SHIFT键,同时选中多个文件; 4)点击add,同时可以在comment栏为你添加的文件夹做一个简单备注; 5)点击OK。 3.3.2.2用拖动的方法添加文件/文件夹 1)打开VSS浏览器,调整其大小,使得Windows资源管理器能够显示出来; 2)打开Windows资源管理器,调整大小,使得两个浏览器可以同时显示; 3)从Windows资源管理器中选择你要添加的文件或文件夹; 4) 拖动你所选的文件或文件夹,放入VSS浏览器,文件被添加进项目,而添加的文件夹将作为项目的子项目。 3.3.3查看文件 1) 在文件列表中选中要查看的文件; 2) 在EDIT菜单中选中view,打开对话框; 3)选中view SourceSafe’s copy of this file; 4)点击OK。 3.3.4创建工作文件夹 在执行签入(check in)、签出(check out)、撤消签出(undo check out)、取出最新版本(get latest version)和文件合并(merge branches)等命令时都必须使用工作文件夹。工作文件夹可以随时设定或修改,VSS系统中可以通过两种方式设置工作文件夹。 3.3.4.1专门创建工作文件夹 1) 在VSS浏览器的文件或项目列表中选中要设置工作文件夹的文件/文件夹; 2) 在file菜单中选择set working folder,打开对话框; 3) 在资源管理列表中选择或新建文件夹; 4) 点击OK。 3.3.4.2利用check out操作设置工作文件夹 在对文件执行check out操作时,如果该文件还没有设置工作文件夹,系统会提示用户为文件创建或指定工作文件夹,用户可以根据系统的提示对文件进行工作文件夹的设置。 3.3.5修改和编辑文件 1) 在edit菜单中选中edit file,打开对话框; 2) 选择check out this file and edit it in your working folder; 3) 点击OK。 注:如果用户已经为文件设置了工作文件夹,VSS会将该文件的一个COPY放入你的工作文件夹并打开文件,让用户进行修改和编辑;如果用户还没有为文件设置工作文件夹,VSS系统会提醒用户设置工作文件夹,用户可根据系统提示,先设置工作文件夹,才可以对文件进行编辑。 3.3.6移动文件/文件夹 3.3.6.1移动文件 你只有一种方法移动文件:将文件共享(share)到项目中,再将其从原来的项目中delete或是destroy。移动文件后,历史信息仍然有效。但是你不能用move命令来移动单个的文件。 3.3.6.2移动文件夹(project) 注:要使用移动(move)命令,必须先请管理员为你设置对移动目的项目的添加(add)权限和对源项目中文件的破坏(destroy)权限。 使用移动命令你可以重新定位子文件夹,将其从一个文件夹移动到另一个文件夹中。这个命令重新定义了被移动文件夹的路径。 这个命令不可以重命名文件;你只能通过执行重命名命令来实现它。这个移动命令不会改变文件夹的内容或其中子文件夹的历史信息,它只会影响到新的和旧的上级文件夹的历史信息。 警告:当你移动一个文件夹之后,就不能再如实地重建其上级文件夹的早期版本。 移动文件夹的具体操作步骤如下: 1) 选中要移动的文件夹; 2) 在file菜单中选中move,打开对话框; 3) 在列表中选择目标文件夹; 4) 点击OK。 3.3.7共享文件/文件夹(share) 1) 在VSS浏览器中选择你要共享的目标项目。 2) 在SourceSafe菜单中选择share,打开共享对话框。 3) 在file to share列表中选择你要共享的文件,如果文件没有显示,可以旁边的项目列表中查找。 4) 点击share。 5) 点击close。 3.3.8拆分文件(branch) 3.3.8.1拆分被共享的文件 1) 在浏览器中选中你想要拆分的文件; 2) 在SourceSafe菜单中选择branch,打开拆分对话框; 3) 在comment中填写备注; 4) 点击OK。 3.3.8.2用一步操作完成文件的拆分与共享 1) 在VSS浏览器中选择你要branch/share的项目; 2) 在SourceSafe菜单中打开share对话框; 3) 在file to share列表中选择要共享的文件,如果你要的文件没有显示,在项目列表中 3.3.9删除/恢复文件或文件夹 如果想从VSS中移走某个文件,你必须首先确定是仅仅从项目中移走,还是从VSS数据库中移走。你还必须确定是要删除文件,但使其能够恢复,还是永久性地破坏它。 VSS中有以下三种途径可以实现从数据库中移走文件。 3.3.3.9.1删除(delete) 将文件从项目中移走。该文件仍然存在于你的VSS数据库和其它共享该文件的项目中,你可以恢复它。此命令同样适用于项目。 1) 选择文件或项目; 2) 选择file菜单中的delete命令; 3) 点击OK。 3.3.3.9.2破坏(destroy) 删除(delete)对话框中有永久性破坏(the Destroy Permanently)选项,你一旦选中它,文件或项目将从VSS数据库中被移走,你不能再恢复它。此外,当Destroy 和Destroy Permanently命令用于共享文件时,它只作用于当前文件夹,其它共享的文件夹仍然保留该文件,该文件依然保存在VSS数据库中。 1) 选择文件或项目; 2) 选择file菜单中的delete命令; 3) 选中 Destroy Permanently 选项; 4) 点击OK。 3.3.3.9.3清除(Purge) 这个命令将永久性地移走你已经删除的文件或项目,但没有破坏它。你可以使用这一命令清空你的文件或项目中的所有内容,但不能恢复它们。 1) 在VSS浏览器中选中项目; 2) 打开file菜单的properties对话框,按delete按纽; 3) 在列表中选择要清除的文件名; 4) 点击purge; 5) 如果要继续,在VSS给你的提示栏中点击yes。 3.3.10查看文件/文件夹的历史信息或早期版本 在历史信息中保存有每一个文件的详细信息。在history对话框中,你不仅可以浏览到文件的版本信息、备注、以及文件的相关历史记录,也能够获取文件的某个旧版本。 注:只有文件(file)可以从历史信息中check out,文件夹(project)不能从中check out。 你还可以从历史信息对话框中执行get、check out、diff、pin、unpin、roll back和reprot等操作。 要查看历史信息: 1) 在tool菜单选中show history,打开history options对话框; 2) 点击OK。 3.3.11获取文件的最新版本 1) 选择你要操作的文件,也可以是多个文件或某个项目; 2) 在SourceSafe菜单中选择get latest version; 3) 如果你事先没有设定工作文件夹,VSS会提示你是否设定一个工作文件夹,点击OK,设定一个工作文件夹; 4) 如果你已经确定了选项,VSS就会显示get latest version对话框,你就可以从当前的项目中获取文件的最新版本的备份,它放在你的工作文件夹中。 3.3.12获取文件的早期版本 1) 选中你要查看的文件; 2) 在tool菜单中选中show history,打开history option对话框; 3) 点击OK,打开history对话框; 4) 选中你要看的版本; 5) 点击get,打开get对话框; 6) 如果你事先没有设定工作文件夹,VSS会提示你是否设定一个工作文件夹,点击OK,设定一个工作文件夹; 7) 在取出对话框中点击OK,文件版本的备份就会从当前项目调入你的工作文件夹。 3.3.13修改用户密码 使用更改密码命令来设置或更改你的密码。要更改密码,必须首先知道当前的密码,如果你忘记了自己的密码,请与管理员联系。 登录的时候,VSS会提示你输入密码以确认你的身份。如果管理员为你设置的用户名与你的网络名是相同的,VSS将不会再提示你输入密码。 注:你的VSS的密码可以与你使用的操作系统的密码相同,也可以不同,它并不会替换你操作系统的密码。 如何更改密码: 1) 从tool菜单打开change password对话框; 2) 在旧密码框里键入你当前的密码; 3) 在新密码框里键入你的新密码; 注:密码可以设1到15个字符,它以*的形式显示; 4) 在确认框里再次键入新密码; 5) 点OK。 3.3.15打开/关闭数据库 如果你使用了VSS,你的文件和项目就会被存储在一个数据库中。它安全地保存你的信息并为你提供重要的历史信息和版本跟踪。要创建新的数据库,要与VSS管理员联系。 3.3.15.1打开现有的数据库 要运行你的VSS,你必须与存储你的文件的数据库连接。这一步通常由VSS自动完成,除非你要选择其他的数据库。如果数据库还没有安装,请与管理员联系。 1) 从file菜单,选择open SourceSafe database,打开对话框; 2) 从数据库列表中选择一个数据库; 3) 点击open,打开数据库。 3.3.15.2关闭数据库 你只能在一个数据库中进行工作。因此,如果要关闭一个数据库,只需打开另一个数据库即可。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值