`

Linux下把多个子目录中的源代码添加到CVS仓库的Bash脚本

阅读更多

Linux下把多个子目录中的源代码添加到CVS仓库的Bash脚本

本文链接:http://codingstandards.iteye.com/blog/792113    (转载请注明出处)

要求描述

  在src目录下,包含多个子目录,每个子目录下都有C/C++的源代码,现在要把它们自动加入到CVS仓库中,只能将源文件(比如.h文件,.c文件,.hpp文件,.cpp文件,makefile)提交,不能包含编译中间产生的临时文件(比如.o文件)和最终执行文件。

  当把一个目录添加CVS仓库之后,目录中会增加一个CVS目录,CVS目录中的几个文件(Entries、Repository和Root)是用来保存一些cvs版本管理信息的。要注意的是cvs这个东西有个问题,使用cvs add CVS时也可以将CVS这个目录添加到CVS仓库中,因此要避免这种情况。

版本演化

版本0

基本思路:遍历每一个子目录,CVS目录除外,如果一个子目录中没有CVS子目录,那么需要添加该目录,否则忽略;然后把该子目录下的源文件添加到CVS仓库中。如下所示:

 

文件:add2cvs0.sh

#!/bin/sh

for d in *
do
	if [ -d "$d" -a "$d" != "CVS" ]; then
		if [ ! -d "$d/CVS" ]; then
			cvs add "$d"
		fi
		cvs add "$d/*.h" "$d/*.c" "$d/*.hpp" "$d/*.cpp" "$d/makefile" "$d/*.java" "$d/*.html"
	fi
done
cvs commit

 

试一下,发现它会把*.h本身作为一个文件名传递给cvs add命令,实际上并不是每个目录中都包含这几种扩展名的文件。因为有些是纯C编写的,有些是用C++的。

[root@rhel55 src]# ./add2cvs0.sh
cvs [server aborted]: Couldn't open RCS file /CVSWEBX/web_spider/src/test0/*.h,v: Invalid argument
cvs [server aborted]: Couldn't open RCS file /CVSWEBX/web_spider/src/test1/*.h,v: Invalid argument
cvs [server aborted]: Couldn't open RCS file /CVSWEBX/web_spider/src/test2/*.h,v: Invalid argument
cvs [server aborted]: Couldn't open RCS file /CVSWEBX/web_spider/src/test3/*.h,v: Invalid argument
cvs [server aborted]: Couldn't open RCS file /CVSWEBX/web_spider/src/test4/*.h,v: Invalid argument
cvs [server aborted]: Couldn't open RCS file /CVSWEBX/web_spider/src/test5/*.h,v: Invalid argument
cvs [server aborted]: Couldn't open RCS file /CVSWEBX/web_spider/src/test6/*.h,v: Invalid argument
cvs [server aborted]: Couldn't open RCS file /CVSWEBX/web_spider/src/test7/*.h,v: Invalid argument
cvs [server aborted]: Couldn't open RCS file /CVSWEBX/web_spider/src/test8/*.h,v: Invalid argument
cvs commit: Examining .
cvs commit: Examining test0
cvs commit: Examining test1
cvs commit: Examining test2
cvs commit: Examining test3
cvs commit: Examining test4
cvs commit: Examining test5
cvs commit: Examining test6
cvs commit: Examining test7
cvs commit: Examining test8
[root@rhel55 src]#

 

版本1

改进思路:把cvs add 后面的那几种通配符表示的文件名,改用Bash中的大括号表示。比如*.{h,c}实际相当于$.h *.c的简写法。

 

文件:add2cvs1.sh

#!/bin/sh

for d in *
do
	if [ -d "$d" -a "$d" != "CVS" ]; then
		if [ ! -d "$d/CVS" ]; then
			cvs add "$d"
		fi
		#cvs add "$d/*.h" "$d/*.c" "$d/*.hpp" "$d/*.cpp" "$d/makefile" "$d/*.java" "$d/*.html"
		cvs add $d/*.{h,c,hpp,cpp,java,html,xml}
	fi
done
cvs commit

 

试一下,还是不行,跟上面一样。因为只是把参数改一下写法,实际上是等同的。

[root@rhel55 src]# ./add2cvs1.sh
cvs [server aborted]: Couldn't open RCS file /CVSWEBX/web_spider/src/test0/*.h,v: Invalid argument
cvs [server aborted]: Couldn't open RCS file /CVSWEBX/web_spider/src/test1/*.h,v: Invalid argument
cvs [server aborted]: Couldn't open RCS file /CVSWEBX/web_spider/src/test2/*.h,v: Invalid argument
cvs [server aborted]: Couldn't open RCS file /CVSWEBX/web_spider/src/test3/*.h,v: Invalid argument
cvs [server aborted]: Couldn't open RCS file /CVSWEBX/web_spider/src/test4/*.h,v: Invalid argument
cvs [server aborted]: Couldn't open RCS file /CVSWEBX/web_spider/src/test5/*.h,v: Invalid argument
cvs [server aborted]: Couldn't open RCS file /CVSWEBX/web_spider/src/test6/*.h,v: Invalid argument
cvs [server aborted]: Couldn't open RCS file /CVSWEBX/web_spider/src/test7/*.h,v: Invalid argument
cvs [server aborted]: Couldn't open RCS file /CVSWEBX/web_spider/src/test8/*.h,v: Invalid argument
cvs commit: Examining .
cvs commit: Examining test0
cvs commit: Examining test1
cvs commit: Examining test2
cvs commit: Examining test3
cvs commit: Examining test4
cvs commit: Examining test5
cvs commit: Examining test6
cvs commit: Examining test7
cvs commit: Examining test8
[root@rhel55 src]#

 

版本2

改进思路:直接使用通配符表示的文件参数(比如*.h)在传递的时候,如果没有可以匹配的文件,那么Bash就会把该参数本身传递。因此想到先用ls命令把这些文件列出来,把输出作为参数来传递。

 

文件:add2cvs2.sh

#!/bin/sh

for d in *
do
	if [ -d "$d" -a "$d" != "CVS" ]; then
		if [ ! -d "$d/CVS" ]; then
			cvs add "$d"
		fi
		#cvs add "$d/*.h" "$d/*.c" "$d/*.hpp" "$d/*.cpp" "$d/makefile" "$d/*.java" "$d/*.html"
		cvs add $(ls $d/*.{h,c,hpp,cpp,java,html,xml,sh} $d/makefile)
	fi
done
cvs commit

 

试一下,发现效果还不错。如果匹配的文件不存在,ls会报错,错误信息是输出在标准错误设备上的,而$(ls *.h)只把标准输出的信息变成字符串。

[root@rhel55 src]# ./add2cvs2.sh
ls: test0/*.h: 没有那个文件或目录
ls: test0/*.hpp: 没有那个文件或目录
ls: test0/*.cpp: 没有那个文件或目录
ls: test0/*.java: 没有那个文件或目录
ls: test0/*.html: 没有那个文件或目录
ls: test0/*.xml: 没有那个文件或目录
ls: test0/makefile: 没有那个文件或目录
cvs server: test0/test0.c already exists, with version number 1.1
cvs server: test0/test0.sh already exists, with version number 1.1
ls: test1/*.h: 没有那个文件或目录
ls: test1/*.c: 没有那个文件或目录
ls: test1/*.hpp: 没有那个文件或目录
ls: test1/*.java: 没有那个文件或目录
ls: test1/*.html: 没有那个文件或目录
ls: test1/*.xml: 没有那个文件或目录
cvs server: test1/makefile already exists, with version number 1.1
cvs server: test1/test1.cpp already exists, with version number 1.1
cvs server: test1/test1.sh already exists, with version number 1.1
ls: test2/*.h: 没有那个文件或目录
ls: test2/*.c: 没有那个文件或目录
ls: test2/*.hpp: 没有那个文件或目录
ls: test2/*.java: 没有那个文件或目录
ls: test2/*.html: 没有那个文件或目录
ls: test2/*.xml: 没有那个文件或目录
ls: test2/*.sh: 没有那个文件或目录
cvs server: test2/makefile already exists, with version number 1.1
cvs server: test2/test2.cpp already exists, with version number 1.1
ls: test3/*.h: 没有那个文件或目录
ls: test3/*.c: 没有那个文件或目录
ls: test3/*.hpp: 没有那个文件或目录
ls: test3/*.java: 没有那个文件或目录
ls: test3/*.html: 没有那个文件或目录
ls: test3/*.xml: 没有那个文件或目录
ls: test3/*.sh: 没有那个文件或目录
cvs server: test3/makefile already exists, with version number 1.1
cvs server: test3/test3.cpp already exists, with version number 1.1
ls: test4/*.h: 没有那个文件或目录
ls: test4/*.hpp: 没有那个文件或目录
ls: test4/*.cpp: 没有那个文件或目录
ls: test4/*.html: 没有那个文件或目录
ls: test4/*.xml: 没有那个文件或目录
ls: test4/makefile: 没有那个文件或目录
cvs server: test4/test4.c already exists, with version number 1.1
cvs server: test4/Test4.java already exists, with version number 1.1
cvs server: test4/test4.sh already exists, with version number 1.1
ls: test5/*.h: 没有那个文件或目录
ls: test5/*.c: 没有那个文件或目录
ls: test5/*.hpp: 没有那个文件或目录
ls: test5/*.java: 没有那个文件或目录
ls: test5/*.html: 没有那个文件或目录
ls: test5/*.xml: 没有那个文件或目录
ls: test5/*.sh: 没有那个文件或目录
cvs server: test5/makefile already exists, with version number 1.1
cvs server: test5/test5.cpp already exists, with version number 1.1
ls: test6/*.h: 没有那个文件或目录
ls: test6/*.c: 没有那个文件或目录
ls: test6/*.hpp: 没有那个文件或目录
ls: test6/*.java: 没有那个文件或目录
ls: test6/*.xml: 没有那个文件或目录
ls: test6/*.sh: 没有那个文件或目录
cvs server: test6/index.html already exists, with version number 1.1
cvs server: test6/makefile already exists, with version number 1.1
cvs server: test6/test6.cpp already exists, with version number 1.1
ls: test7/*.h: 没有那个文件或目录
ls: test7/*.c: 没有那个文件或目录
ls: test7/*.hpp: 没有那个文件或目录
ls: test7/*.java: 没有那个文件或目录
ls: test7/*.html: 没有那个文件或目录
ls: test7/*.sh: 没有那个文件或目录
cvs server: test7/makefile already exists, with version number 1.1
cvs server: test7/spider.xml already exists, with version number 1.1
cvs server: test7/test7.cpp already exists, with version number 1.1
ls: test8/*.h: 没有那个文件或目录
ls: test8/*.c: 没有那个文件或目录
ls: test8/*.hpp: 没有那个文件或目录
ls: test8/*.java: 没有那个文件或目录
ls: test8/*.html: 没有那个文件或目录
ls: test8/*.xml: 没有那个文件或目录
ls: test8/*.sh: 没有那个文件或目录
cvs server: test8/makefile already exists, with version number 1.1
cvs server: test8/test8.cpp already exists, with version number 1.1
cvs commit: Examining .
cvs commit: Examining test0
cvs commit: Examining test1
cvs commit: Examining test2
cvs commit: Examining test3
cvs commit: Examining test4
cvs commit: Examining test5
cvs commit: Examining test6
cvs commit: Examining test7
cvs commit: Examining test8
[root@rhel55 src]#

 

版本3

改进思路:把ls的错误输出摒蔽掉,通过将标准错误输出重定向到/dev/null就可以做到了。

 

文件:add2cvs.sh

#!/bin/sh

for d in *
do
	if [ -d "$d" -a "$d" != "CVS" ]; then
		if [ ! -d "$d/CVS" ]; then
			cvs add "$d"
		fi
		#cvs add "$d/*.h" "$d/*.c" "$d/*.hpp" "$d/*.cpp" "$d/makefile" "$d/*.java" "$d/*.html"
		cvs add $(ls $d/*.{h,c,hpp,cpp,java,html,xml,sh} $d/makefile 2>/dev/null)
	fi
done
cvs commit

 

试一下,目标基本达到。

[root@rhel55 src]# ./add2cvs.sh 
cvs server: test0/test0.c already exists, with version number 1.1
cvs server: test0/test0.sh already exists, with version number 1.1
cvs server: test1/makefile already exists, with version number 1.1
cvs server: test1/test1.cpp already exists, with version number 1.1
cvs server: test1/test1.sh already exists, with version number 1.1
cvs server: test2/makefile already exists, with version number 1.1
cvs server: test2/test2.cpp already exists, with version number 1.1
cvs server: test3/makefile already exists, with version number 1.1
cvs server: test3/test3.cpp already exists, with version number 1.1
cvs server: test4/test4.c already exists, with version number 1.1
cvs server: test4/Test4.java already exists, with version number 1.1
cvs server: test4/test4.sh already exists, with version number 1.1
cvs server: test5/makefile already exists, with version number 1.1
cvs server: test5/test5.cpp already exists, with version number 1.1
cvs server: test6/index.html already exists, with version number 1.1
cvs server: test6/makefile already exists, with version number 1.1
cvs server: test6/test6.cpp already exists, with version number 1.1
cvs server: test7/makefile already exists, with version number 1.1
cvs server: test7/spider.xml already exists, with version number 1.1
cvs server: test7/test7.cpp already exists, with version number 1.1
cvs server: test8/makefile already exists, with version number 1.1
cvs server: test8/test8.cpp already exists, with version number 1.1
cvs commit: Examining .
cvs commit: Examining test0
cvs commit: Examining test1
cvs commit: Examining test2
cvs commit: Examining test3
cvs commit: Examining test4
cvs commit: Examining test5
cvs commit: Examining test6
cvs commit: Examining test7
cvs commit: Examining test8
[root@rhel55 src]#

0
0
分享到:
评论

相关推荐

    linux下的cvs

    它主要用于管理软件项目中的源代码变更历史,支持多用户协作开发,能够有效地追踪文件或项目的修改历史。 在Red Hat 9系统上,可以通过以下方式检查是否已安装CVS: ```shell rpm -qa | grep cvs ``` 如果显示结果...

    cvs源代码管理工具

    总的来说,Cvs作为一款历史悠久的源代码管理工具,虽然在某些方面已被现代工具超越,但在理解其基本原理和操作后,我们仍然可以从中学到很多关于版本控制的知识,这对于任何软件开发人员来说都是宝贵的。

    linux安装cvs操作手册

    - **CVS**(Concurrent Versions System)是一种源代码版本控制系统,主要用于软件开发过程中对多个版本进行管理和跟踪。 - 在Linux环境下安装并配置CVS,能够帮助团队更有效地管理代码版本和协同工作。 #### 二、...

    linux下CVS使用帮助

    `-m`与注释字符串之间必须留有一个空格,否则CVS会将当前目录下的所有文件递归签入库中,这可能会导致版本库中的代码被“污染”。 ##### 4. cvs up (Update) - **语法**: `cvs up [options] files` - `options`: ...

    如何在myeclipse中把工程共享到部署在红旗linux中的cvs服务器中.txt

    1. **选择一个目录作为CVS仓库**:在本例中,我们使用`/usr/local/cvsroot`作为仓库路径。 2. **初始化CVS仓库**:使用`cvs -d /usr/local/cvsroot init`命令初始化仓库。 #### 3. 配置SSH连接 为了确保CVS服务器...

    linux下cvs维护说明

    Linux下的CVS(Concurrent Versions System)是一种广泛使用的源代码版本控制系统,它允许开发者在团队环境中协作开发软件项目。在Linux环境下,CVS的使用和维护涉及到多个方面,包括安装、库的创建、权限设置以及...

    cvs最简单的使用方法

    这将在当前目录下创建一个名为`my_project_checkout`的目录,包含从CVS仓库检出的最新项目文件。 ### 更新和同步 要获取仓库中的最新更改,使用`cvs update`命令: ```bash cd my_project_checkout cvs update ``...

    Linux下CVS服务器的配置

    【Linux下CVS服务器的配置】是指在Linux操作系统中设置和管理CVS(Concurrent Versions System)服务器的过程。CVS是一种版本控制系统,用于跟踪软件开发过程中文件的变更,便于团队协作。以下是详细的配置步骤: 1...

    Myeclipse+下配置CVS服务器源代码管理

    在IT行业中,源代码管理是开发团队协作的重要环节,它确保了代码的安全、版本控制以及团队成员间的同步。本教程将详细介绍如何在MyEclipse环境下配置CVS(Concurrent Versions System)服务器,以便进行有效的源代码...

    linux服务器端和windows客户端cvs.rar

    - 通过WinCVS的“导入选项”导入现有项目到CVS仓库,或者直接在CVS仓库中创建新项目。 三、注意事项 - 确保Linux服务器上的防火墙设置允许CVS的TCP端口(默认为2401)通信。 - 在Windows客户端,使用`cvsnt-2.5....

    代码版本控制软件CVS-2.5

    cvs 将创建project_name目录,并将最新版本的源代码导出到相应目录中。这个checkout和Virvual SourceSafe中的check out不是一个概念,相对于Virvual SourceSafe的check out是cvs update, check in是cvs commit。

    LinuX下 CVS 安装部署备份恢复等

    Linux 下 CVS 安装部署备份恢复等 本文档详细介绍了在 Linux 操作系统下安装、部署、备份和恢复 CVS 服务器的步骤,旨在帮助读者快速搭建 CVS 服务器环境。 一、安装 Linux 服务器 在安装 Linux 服务器时,需要...

    CVS.rar_cvs_cvs Lin_cvs linux_linux c_linux c++

    在描述中提到的“linux下CVS的应用指南”,意味着我们将讨论如何在Linux系统上安装、配置和操作CVS。首先,你需要安装CVS客户端和服务器,通常可以通过Linux的包管理器(如apt-get或yum)轻松完成。安装完成后,可以...

    Linux下CVS服务器配置

    总结起来,配置Linux下的CVS服务器涉及到下载源代码,编译安装,配置服务启动方式,创建Repository,设置权限,以及调整相关配置文件。这个过程虽然有些复杂,但是一旦完成,就能为团队提供一个可靠的版本控制基础...

    linux下cvs安装配置全过程

    本文主要介绍了在 Linux 系统中安装配置 CVS 服务器的全过程,从确认系统中是否已经安装了 CVS 服务到建立 CVSROOT 目录、配置 CVSROOT 目录权限、建立 CVS 仓库、配置 CVS 服务器和添加可以使用 CVS 服务的用户。

    linux下CVS的配置与安装

    Linux 下 CVS 的配置与安装 安装 CVS 在 Linux 系统中,安装 CVS 服务器端非常重要。首先,需要确认系统是否已经安装了 CVS。如果没有安装,可以使用以下命令安装: ``` # yum install cvs ``` 配置 CVS 服务器 ...

    linux下教你如何配置CVS服务器

    ### Linux下配置CVS服务器详解 CVS(Concurrent Versions System)是一款开源版本控制系统,在软件开发过程中被广泛用于代码管理。本文将详细介绍如何在Linux环境下配置CVS服务器,包括搭建环境、用户管理、权限...

    MyEclipse下面配置CVS源代码管理的详细步骤

    在MyEclipse中配置CVS(Concurrent Versions System)源代码管理是一项重要的步骤,它能够帮助开发者有效地管理和协同开发项目代码。以下是一个详尽的配置流程: 首先,你需要在服务器上安装CVSNT-2.5.01,这是一个...

    Linux下CVS服务器的配置.doc

    ### Linux下CVS服务器的配置知识点详解 #### 一、验证是否已安装CVS 在开始配置CVS服务器之前,首先要确认系统是否已经安装了CVS。可以通过以下命令检查: ```bash # rpm -qcvs ``` 如果系统中已安装CVS,此命令...

Global site tag (gtag.js) - Google Analytics