打印

求单片机程序版本管理方法

[复制链接]
5279|16
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
lxl_0598|  楼主 | 2009-10-30 10:48 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
眼下遇到这么一个问题:刚接手软件工作,公司现有产品版本繁多,即便是同一款产品由于更改部分小功能而形成多种版本,管理起来很不方便。(因是小公司没什么经验,自己也是刚毕业的。) 另外自己以后开发程序时肯定会经常改动,但并非我们每次对程序所做的每一次改动都是正确的。当我们将原来的源程序更改或覆盖掉,有一天突然发现自己的改动居然是隐藏重在错误的,要想恢复原来的却不可能。许多同仁都采用不断备份的方式。当然这大多数都是靠 复制+粘贴 文件实现的。当我们调试一个程序,改动了100次,这样就要有100个源文件,而如何记得起这100个文件分别都做过哪些改动。并不是一件容易的事。
     所以请大家来讨论下关于版本的管理,说一说自己是如何对软件版本进行管理的,还望各位,不吝赐教。

相关帖子

沙发
宇容创行| | 2009-10-30 10:57 | 只看该作者
用最常用的cvs啊,不要去搞什么特殊的方法

使用特权

评论回复
板凳
lxl_0598|  楼主 | 2009-10-30 11:29 | 只看该作者
在网站上搜索了下 看到 相关的管理工具有VSS和CVS。弱弱的问一下:二者有什么区别?用哪个好?

使用特权

评论回复
地板
lxl_0598|  楼主 | 2009-10-30 11:33 | 只看该作者
补充下:目前公司研发人员,硬件1人、软件1人,估计软件还会再招1人。
这种情况下 有没需要用专门的管理软件?

使用特权

评论回复
5
highend| | 2009-10-30 11:42 | 只看该作者
管理软件,不是管理人。
而是管理 程序代码!把每次修改的内容标记清楚,方便回忆,检查。

人不多,还有一个好办法,就是写文档,大量注释。清楚明白。

使用特权

评论回复
6
highend| | 2009-10-30 11:43 | 只看该作者
即使一个人开发,用CVS的,也不少。管理自己的代码。

使用特权

评论回复
7
lxyppc| | 2009-10-30 12:10 | 只看该作者
版本管理我用的是TortoiseSVN,比较程序用的是ExamDiff
每次改动都记下log,可以很方便的回到某一个版本,也可以很容易比较版本之间的改动
而且网上很多开源项目的代码也都是放在SVN服务器上的,用SVN很容易查看

如果你写的代码需要需要维护,不管是几个人写,你都需要类似这样的一个工具

使用特权

评论回复
8
864| | 2009-10-30 15:30 | 只看该作者
改动过的地方 #if 0  #endif 并做好注释,不要急着从源文件里删除

使用特权

评论回复
9
5880527| | 2009-10-30 16:07 | 只看该作者
楼主一开始就有这样的意识,很好哈

使用特权

评论回复
10
BitFu| | 2009-10-30 17:23 | 只看该作者
单片机小程序感觉没有必要用CVS,自己定个版本,每个重要的改动备份一次,要写详细的说明文档
个人做法。

使用特权

评论回复
11
yewuyi| | 2009-10-30 19:26 | 只看该作者
我都自己起了一个版本号。

产品型号+版本号+时间

使用特权

评论回复
12
原野之狼| | 2009-10-30 20:06 | 只看该作者

svn

本帖最后由 原野之狼 于 2009-10-30 20:10 编辑

我用svn
my_project - Revision 14: /weight/software/dev1/out/app
..
cs5534.cpp
cs5534.h
filter.cpp
filter.h
global.h
hc595.cpp
hc595.h
includes.h
includes_cpp.h
key.cpp
key.h
main.cpp
menu.cpp
menu.h
my_eeprom.cpp
my_eeprom.h
pid.cpp
pid.h
pwm.cpp
pwm.h
queue.cpp
queue.h
task.cpp
task.h
type.h
ui.cpp
ui.h
Powered by Subversion version 1.6.2 (r37639).

使用特权

评论回复
13
与时俱进| | 2009-10-30 23:23 | 只看该作者
记号1个。

使用特权

评论回复
14
程序匠人| | 2009-10-31 01:40 | 只看该作者
CVS版本管理2007-05-14 10:33版本管理系统可以帮助开发人员有效地管理软件资源的版本问题。CVS(Concurrent Version System)是目前最常用的版本管理系统,而 ECLIPSE 是最流行的开放源码的集成开发环境。在 ECLIPSE 中,与 CVS 相关的功能被统称为小组开发环境。本系列的第 1 部分不仅解释了 CVS 的相关术语,还详细介绍了小组开发环境的建立过程;本系列的第 2 部分则试图以一种简明易懂的方式来讲解 ECLIPSE 小组开发环境的使用方法。
1.前言

版本管理系统可以帮助开发人员有效地管理软件资源(源代码文件、配置文件等)的版本问题。版本管理系统可以帮助开发人员追踪文件的修改履历;防止文件因疏忽而被错误的修改、删除;在小组开发环境中,帮助多个开发人员保持文件的同步;通过文件的修改履历,还可以帮助开发人员发现修改过程中产生的BUG,因此应用CVS可以在一定程度上提高软件的开发效率。现在很多开发工具中都集成了CVS功能,例如ECLIPSE、InteliJ、NetBeans等;虽然ECLIPSE等集成开发环境(IDE)对CVS提供了很好的支持,可以大幅降低CVS的使用难度,但是很多开发人员在使用CVS时还是不知所措。笔者认为这是由于他们不了解CVS的相关术语及CVS的工作模式所致。因此,本文首先介绍CVS的相关术语及CVS的工作模式。然后通过一些实例与应用场景, 展示如何在ECLIPSE中使用小组开发环境。

本文所使用的ECLIPSE没有安装本地语言包插件,操作界面为英文。但理解了相关术语后,读者即使在中文环境中也能正常操作。






回页首




2.CVS的相关术语与CVS工作模式

2.1 术语解释

修订版(revision):CVS版本管理系统用修订版来管理文件的修改履历,修订版用版本号来表示,即修订版号。对文件的每次修改(提交)都产生一个新的修订版。

资源库(repository):资源文件的集合,版本管理的容器。在ECLIPSE中被称为CVS存储库。

模块(module):资源文件的组织形式,在版本管理系统中的表现形式为目录(树形结构,可以嵌套)。

输入(import):将处于资源库之外的软件模块登录到资源库。

输出(export):从资源库中取出模块。使用export方式取出的模块拷贝不包含版本管理的相关信息,对该模块拷贝的修改也不能反映到资源库。

工作拷贝(working copy):版本管理系统是一个典型的CLIENT/SERVER系统。用户对资源的修改不是直接在SERVER端进行的,而是根据资源库的内容创建一个本地的工作拷贝,用户在工作拷贝中工作,工作完成后再将修改的内容提交到资源库。

签出(checkout):获得工作拷贝的操作。此前使用过Visual Source Safe的读者需注意,在Visual Source Safe中的checkout用于锁定文件。

签入/提交(checkin/commit):将对工作拷贝的修改反映到资源库中的操作。在CVS中使用的术语是提交;在Visual Source Safe中使用的术语是签入。

更新(update):将资源库中的最新状态反映到工作拷贝的操作。

冲突(conflict):在资源库同工作拷贝之间状态不一致的状态下进行签入或更新操作时,版本管理系统可能会尽量进行合并,如果版本管理系统不能完全处理上述不一致,就称之为产生了冲突。

快照(snapshot):在某一时刻,模块中文件状态(包括文件内容及其版本管理元信息)的静态影像。

标签(tag):由于CVS以文件为版本管理的基本单位,随着开发的进行,对不同的文件的修改次数是不一样的,各个文件的修订版号会因此而变得参差不齐。这不便于模块的管理。为此可以对某个时刻的快照赋予一个标识名称,标识名称就被称为标签。将来通过标签就可以获得模块在该时刻的快照。通过标签所获得的快照是静态的,不能被修改。在ECLIPSE中,标签与版本(Version)是同义词,一般都用于文件集合。需要指出的是:在很多中文资料里,修订版与版本往往不加区分,有时会将单个文件的修订版也称为版本。例如,"A文件最新版本是1.3",这句话中的版本实际上指的是修订版。因此,需要根据上下文来确定版本的意义。

分支(branch):分支是一种特殊的标签。从分支中签出的资源是可以被修改的。引入分支是为了更好地支持项目的并行开发过程。

2.2 工作模式

为了解决因多人同时开发而可能产生的冲突问题,版本管理系统有两种常用的工作模式。

模式一:锁定-修改-解锁模式

在这种工作模式中,一个开发人员为了能够修改文件,首先必须锁定文件,锁定文件操作赋予了开发人员修改文件的权力。从一个文件被锁定后到其被解锁前,其他的开发人员不能再锁定该文件。这种工作模式适用于小规模的开发小组。如果采用这种工作模式,开发人员应尽量少、尽可能晚地锁定文件并尽可能早解锁文件。模式一是Visual Source Safe的缺省工作模式。

模式二:拷贝-修改-合并模式

在这种工作模式中,每个开发人员都从资源库获得自己的工作拷贝,然后就可以自由的在工作拷贝中继续开发,开发完成后再向资源库提交自己的工作成果。如果在提交时产生了冲突,则必须在解决冲突后才能再提交。模式二比模式一具有更好的并发性,因而也适用于中、大规模的开发小组。模式二是CVS所采用的工作模式。

锁定-修改-解锁模式是一种悲观的锁定模式,它假定在开发过程中可能会产生大量的冲突;而拷贝-修改-合并模式则比较乐观,它假定在开发过程中软件的设计及开发任务的分配都比较合理(软件的模块化程度高,开发人员一般各司其职),在开发过程中即使会产生冲突,但产生冲突的机率比较小。为了更好地使用CVS,我们在使用CVS时也应该遵循它的设计前提,努力提高软件的设计水平及项目管理的能力,否则将陷入疲于解决提交冲突的尴尬境地。

如果想进一步了解CVS的理论知识,请参看文后的参考资料1和参考资料2。






回页首




3.环境安装

LINUX与WINDOWS是目前应用最普及的操作系统。下面首先介绍CVS服务器在两种操作系统上的安装与配置过程,然后介绍如何从ECLIPSE连接CVS服务器,最后介绍如何使用ECLIPSE共享模块。无论后台的CVS安装在何种操作系统之上,对于ECLIPSE来说,与CVS服务器建立了连接之后其使用方法是一样的。

3.1 在FEDORA CORE3上安装、配置CVS

3.1.1 安装CVS

本文所使用的LINUX发行版为FEDORA CORE3。首先,查看在系统中是否已经安装了CVS服务器,如果没有安装,则可以从FEDORA CORE3的发行光盘或从网络上下载相应的软件包,本文中使用的软件包为cvs-1.11.17-7.FC3.i386.rpm。安装过程如下(在本节中,绿色的为命令行,紧随命令行的黑色文本为系统响应):



[root@emulator cvsres]#    rpm -ivh cvs-1.11.17-7.FC3.i386.rpm
warning: cvs-1.11.17-7.FC3.i386.rpm: V3 DSA signature: NOKEY, key ID 4f2a6fd2
Preparing...                  ########################################### [100%]
     1:cvs                      ########################################### [100%]




可以用如下命令查询系统中是否已经安装了CVS服务器:



[jiangch@emulator ~]$ rpm -qa | grep cvs
cvs-1.11.17-7.FC3




确认在文件/etc/services中含有以下内容:



cvspserver        2401/tcp                          # CVS client/server operations




在目录/etc/xinetd.d中建立一个文件cvspserver,文件内容如下:



service cvspserver
{
          socket_type = stream
          protocol   = tcp
          wait    = no
          user    = root
   passenv   = PATH
          server   = /usr/bin/cvs
          server_args = --allow-root=/home/jiangch/cvsrepo pserver -f
}




其中,--allow-root的值为CVS资源库的根目录。如果建立自己的CVS服务器,需要根据实际情况作相应的修改。

3.1.2 启动CVS服务

在FEDORA CORE中的CVS服务由xinetd管理,安装完成后通过下面的命令可以启动CVS服务:



[root@emulator cvsres]#    /etc/init.d/xinetd restart
Stopping xinetd:                                            [    OK    ]
Starting xinetd:                                             [    OK    ]




3.1.3 初始化资源库

在LINUX中,可以用下面的命令初始化CVS资源库:



[root@emulator cvsres]#    cvs -d /home/jiangch/cvsrepo init




3.1.4 添加CVS用户

初始化资源库后,会在CVS资源库的根目录下生成一个新的目录CVSROOT。在目录中新建一个名为passwd的文件,为了简便,文件内容的格式为:
用户帐号:密码
每个用户一行,用户帐号应在系统中存在。由于密码必须是加密的,可以从文件/etc/shadow中提取。这样CVS用户将与LIUNX系统用户具有相同的帐号和密码。

3.1.5 注意事项

在缺省状态下LIUNX的安全性比较高,对目录、文件的读写操作有较严格的控制。为了在LINUX下方便的使用CVS,最好建立一个组(group),例如"cvsusers",将CVS的用户都加入"cvsusers"中。这样一来,只要将CVS资源库根目录及其所有子目录(含目录中的所有文件)的读写权限赋予组"cvsusers",组中的所有用户都能使用CVS。

3.2 在WINDOWS XP上安装、配置CVSNT

本文以下的内容都基于WINDOWS XP+CVSNT+ECLIPSE。整个实验环境包括两台以WINDOWS XP2为操作系统的计算机,其中一台名为"chjnb"的计算机既作为CVS服务器又安装了ECLIPSE作为客户端,而另一台只安装了ECLIPSE。CVSNT与ECLIPSE都采用了本文写作时的最新版本,分别是CVSNT2.5.03.2151和ECLIPSE3.1.1。ECLIPSE3.1.1可以和CVSNT2.0.58b以上版本很好的协同工作(见参考资料3)。

CVSNT最初起源于CVS,也是一个开放源码产品,具有跨平台的能力,可以运行在多种操作系统之上。WINDOWS版的CVSNT在安装和使用上都比较方便,对WINDOWS用户而言具有很强的亲和力。WINDOWS版的CVSNT经过多年的发展,其功能与稳定性得到不断的加强,完全可以胜任实际工作中的版本管理任务。而且相对于CVS而言,CVSNT还扩展了不少功能。CVSNT与CVS的比较请参看参考资料4。

3.2.1 安装CVSNT

CVSNT可以从以下地址获得http://www.march-hare.com/cvspro/。在WINDOWS系统上CVSNT有安装程序cvsnt-2.5.03.2151.msi(随版本的不同文件名也不同)。一般采取缺省安装方式安装后,CVSNT即可正常工作,如果想控制安装过程,则可以选择定制安装方式。例如在图1、图2中修改了安装目录。



图1:选择CVSNT的安装类型



图2:修改CVSNT的安装目录,选择CVSNT的可安装组件


安装完成后可以通过菜单操作【开始】→【CVSNT】→【CVSNT Control Panel】或控制面板打开CVSNT的控制管理台。为了使用CVSNT进行版本管理,首先必须建立一个资源库。在CVSNT的控制管理台中选择"Configuration Repository"面板并单击"Add",出现如图3所示的画面。



图3:初始化资源库


在Location中填入资源库的位置,在Description中填写该资源库的说明信息(可以为空)。值得注意的是当Location包含多级目录时,Name输入框中的缺省值不对,需要修改,例如可以使用最后一级目录名,如图3。最后点击"OK"按钮,在随后出现的询问是否初始化资源库的确认对话框中选择"Yes"即可。

3.2.2 Windows防火墙

如果在安装有CVS服务器的计算机上使用的是WINDOWS XP2操作系统,并且WINDOWS XP2自带的Windows防火墙处于启用状态,则不能从其它计算机连接CVS服务器。读者可以暂时关闭Windows防火墙或者将CVSNT服务的端口号(2401)添加到Windows防火墙的例外中,其设置步骤如下:

1.从WINDOWS操作系统的控制面板中双击"Windows防火墙"的图标,出现如图7所示的画面。



图7:Windows防火墙控制台


2.在图7中单击"添加端口"按钮,请按图8将CVSNT的服务端口加入防火墙的例外列表。



图8:将CVSNT的服务端口加入防火墙的例外列表


3.在图8中按"确定"按钮就把CVSNT的服务端口加入防火墙的例外列表,见图9。



图9:CVSNT的服务端口已被加入到防火墙的例外列表


如果使用了其他的防火墙产品,也应进行相应的设置。

3.2.3 建立CVS用户

为了在我们的实验环境中模拟多个用户,还需要在CVS服务器中建立至少两个CVS用户。由于CVSNT安装后采用混合认证方式工作,CVS服务器的系统用户和在CVS本身管理的用户文件中定义的用户都能使用CVSNT服务。为了简便,本文建立了两个系统用户。在WINDOWS XP中可以通过计算机管理这一工具追加系统用户,如图6所示。除了管理员帐号jiangch(我将管理员Administrator重命名为jiangch),还添加了一个帐户cvsuser2。



图6:添加用户帐号


现在可以在另一台计算机的ECLIPSE中,以cvsuser2为用户名建立与CVSNT服务器的连接。至此,我们就建立了一个完整的实验环境。本文的实验环境用了两台计算机,如果计算机的内存够大,也可以在一台计算机上建立一个完整的实验环境。

3.3 建立ECLIPSE与CVS服务器的连接

ECLIPSE可以从http://www.ECLIPSE.org/download下载。ECLIPSE无需安装,在已安装JRE或JDK1.4.2或以上版本的计算机上,只要将下载的文件解压后即可运行。为了能在ECLIPSE使用CVS,需要建立ECLIPSE与CVS服务器的连接。其操作步骤如下:

1.打开CVS Repository视图(Perspective),可以通过如下菜单操作实现:【Window】→【Open Perspective】→【Other...】。在出现的对话框中选择CVS Repository Exploring。

2.在CVS Repository视图中单击右键,选择【New】→【Repository Location...】(在ECLIPSE中,如果菜单项的后面有省略号,则表示选择该菜单项后,将出现对话框供用户进一步设定相关信息)。出现如图4所示对话框。在对话框中填入适当的信息即可。例如,根据图中的示范信息,将与我们在前面步骤所安装的CVSNT服务器建立连接。需注意的是:在Host输入框中可以输入CVS服务器的名字或IP地址;在连接类型下拉框中选择pserver,这是CVSNT+ECLIPSE最简便的配置方式。



图4:在ECLIPSE中建立与CVSNT服务器的连接


建立连接后,在ECLIPSE的CVS资源库透视图中的结果如图5所示。其中的HEAD表示主分支(主干)、Branches是分支的集合、Versions是标签的集合、Dates是用时间做标签的集合。由于jiangch是管理员帐户,因此还显示了CVSNT的管理文件集合CVSROOT。如果以非管理员帐户连接到CVSNT服务器,则看不到上述CVSROOT。



图5:CVS资源库视图






回页首




4.模块的输入与签出

4.1 输入(import)

在正式的项目开发中,输入模块通常由CVS管理人员或项目经理完成,一般的开发人员不需要进行此项工作。在ECLIPSE中,可以将整个项目作为一个模块导入CVS资源库。这也是实际工作中经常采用的工作方式。我们事先在计算机chjnb的ECLIPSE中建立了一个项目UnitTest,如图10所示。



图10:演示用项目的导航器视图


为了将项目导入CVS资源库:打开ECLIPSE,选择希望导入CVS资源库的项目(project),点击右键,在出现的弹出菜单中依次选择【Team】→【Share Project...】,出现图11。



图11:共享项目--选择资源库


点击Next按钮,在下一个对话框中选择"use project name as a module name",再点击Next按钮,此时,出现如图12所示的对话框。



图12:共享项目--控制共享内容


有一些文件,我们不想加入CVS资源库。例如图9中的bin目录,里面放的是编译时生成的class文件。此时,可以在上述对话框的bin目录上点击右键,在出现的弹出菜单中选择【Add to cvsignore...】,出现图13。(注:在preference中也可以进行设定)在图13中单击OK按钮。



图13:共享项目--选择哪类资源不用放入资源库


随后单击图12中的Finish按钮,在接下来的一系列对话框中,选择Yes。随后出现如图14的对话框,在输入框中输入注释,例如:"XXX项目初始化"。 最后单击OK按钮。ECLIPSE将向CVS资源库中导入代码模块。



图14:共享项目--填写注释


模块导入成功后, java视图如图15所示。处于CVS管理状态的目录和文件,其图标的右下角有一个小圆柱。由于在前面的操作中,我们将bin目录排除了,因此bin目录显示为通常的图标。在文件的后面,显示了该文件的修订版号,而在目录的后面则没有,这是因为CVS系统版本管理的对象只是文件,而目录不是CVS版本管理的对象。所有文件的初始修订版号均为1.1。输入成功后,整个项目本身也处于签出的状态。



图15:处于版本管理状态下的项目视图


4.2 签出(checkout)

如果想通过其它计算机上的ECLIPSE获得工作拷贝,按2.2的操作成功建立连接后,CVS Repository透视图见图16。在主分支HEAD下的 UnitTest上点击右键,在出现的弹出菜单中选择【Check Out】,这将签出CVS资源库中的模块UnitTest,并在ECLIPSE建立一个名为UnitTest的新Project。签出成功后转到java视图,会看到一个和图15类似的界面。



图16:在CVS资源库中已经存在一个共享项目UnitTest


在菜单中还有一项【Check Out As...】,通过此菜单项,可以对签出进行更细致的控制,例如,可以更改Project名;可以将签出的内容追加到已有Project中。






回页首




结束语

在本系列的第1部分,介绍了CVS的相关术语及小组开发环境的建立过程。在本系列的第2部分,将详细介绍ECLIPSE小组开发环境的使用方法。

使用特权

评论回复
15
lxl_0598|  楼主 | 2009-11-1 09:07 | 只看该作者
highend发表于 2009-10-30 11:43 | 只看该作者 回复 引用 评分 报告 返回版面 TOP  得分:0
6楼: 即使一个人开发,用CVS的,也不少。管理自己的代码。

同意
即使一个人开发,也要养成好的习惯,以后到其他公司很可能用的上。

-------------------------------------------------------------------------------------------------------------------
7楼的给的回复 比较适合我

使用特权

评论回复
16
lxl_0598|  楼主 | 2009-11-1 09:11 | 只看该作者
谢谢 各位的点子
谢谢 匠人 的详细介绍

综合比较了一下,发现TortoiseSVN 比较适合我。

使用特权

评论回复
17
makesoft| | 2009-11-1 09:46 | 只看该作者
确实SVN很好用,一个人用可以就把自己的机器当做服务器和客户端,几个人用还是装一台服务器好,这样最大的好处也避免了个人机器病毒感染做成的风险。

我自己是用了RAID 1镜像做了一台server,使用了半年,感觉良好,能遍历出每个项目每次修改的原因和内容。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

16

主题

225

帖子

1

粉丝