CVS有完善的文档,因此此处不在一一赘述,只涉及到本人遇到的一些陷阱。
何为0D0A(CRLF),DOS下的回车换行是也。由于CVS的服务器端和客户端都可能跨平台, 那么我们分别来说。
服务器端
无论在UNIX上还是WINDOWS(cvsnt)的服务器,都以同样的格式保存文本文件的 换行符(无论是DOS的0D0A,还是UNIX上的0A,还是MAC上的0D)。服务器端都 将换行符保存为 0A。
但这并不是说在服务器端存储的文件(以 ,v结尾),不能包含字符“0D”。 比如二进制文件中很多包含字符0D。文本文件也可能包含0D,但大部分包含0D的 文本文件,很有可能是由于不当的跨平台使用CVS造成的。
服务器端的这种处理方法很好的适应了跨平台特性。亦即Unix端服务器的Repository 可以直接拷贝到Windows端的Repository中,Vice Versa。
![]() | 在将Unix维护的服务器端,移植到Windows端,我曾经遇到一个百思不得其解的问题。后来发现是由于Winzip的一个古怪的缺省设置造成的:“TAR file smart CR/LF conversion”! |
UNIX 客户端
Unix上的客户端文本原样存储保存到服务器端,0D作为普通字符随文件checkin,因为 Unix的默认文件换行符为 “0A”。
但是如果Unix端的文件因为某种原因,如使用samba共享unix的文件系统,用WINDOWS 工具编辑,导致文件换行符变为 CRLF,则在 Unix 下 checkin,会将 OD 随文件checkin。
Windows 客户端
WINDOWS上的客户端,具有智能CRLT转换的功能,即:将文本文件中的CRLF转换为LF,提交 到服务器端,又可以将服务器端的LF转换为CRLF。
WINDOWS上的客户端,具有智能CRLT转换的功能,即:将文本文件中的CRLF转换为LF,提交 到服务器端,又可以将服务器端的LF转换为CRLF。但是如果服务器端是CRLF,则转换为CRCRLF。
WinCVS 客户端的双重身份
WinCVS 可以兼具 Windows和Unix客户端的特性。当选择选项: Admin-->Preferences-->Globals-->Checkout text files with the Unix LF。 则成为类似 Unix 客户端的功能。
强烈建议不要选择该选项,让一个工具做它不相称的工作,出问题是迟早的事情。
Cygwin 的CVS客户端
Cygwin的客户端相当于 Unix 的客户端。
由于运行在Windows上,可能经常提交带有 CRLF 的文本文件,因此我常常用Windows的客户端程序 替换调 Cygwin 下自带的 CVS。
CRLF引起的一团糟
Client Action Server ============================================================ LF -- Unix checkin --> LF CRLF <-- Windows checkout -- LF CRLF -- Unix checkin --> CRLF CRCRLF <-- Windows checkout -- CRLF |
![]() | 要防止混乱切记不要用Unix的CVS客户端(包括Cygwin的CVS客户端)Checkin DOS格式的文件。 |
在把二进制文件加入CVS时,需要指定 -kb 选项。但是为防止万一,最好使用 CVS的配置文件 cvswrappers 来最后把关。
# cat CVSROOT/cvswrappers *.gif -k 'b' *.GIF -k 'b' *.jpg -k 'b' *.JPG -k 'b' *.png -k 'b' *.PNG -k 'b' *.pdf -k 'b' *.PDF -k 'b' *.avi -k 'b' *.AVI -k 'b' *.mp3 -k 'b' *.MP3 -k 'b' *.mpg -k 'b' *.MPG -k 'b' *.doc -k 'b' *.DOC -k 'b' *.xls -k 'b' *.XLS -k 'b' *.xl* -k 'b' *.XL* -k 'b' *.mpp -k 'b' *.MPP -k 'b' *.ppt -k 'b' *.PPT -k 'b' *.dot -k 'b' *.DOT -k 'b' *.jar -k 'b' *.JAR -k 'b' *.tif -k 'b' *.TIF -k 'b' *.swf -k 'b' *.SWF -k 'b' *.bmp -k 'b' *.BMP -k 'b' *.exe -k 'b' *.EXE -k 'b' *.o -k 'b' *.O -k 'b' *.tgz -k 'b' *.TGZ -k 'b' *.gz -k 'b' *.GZ -k 'b' |
CVS 服务器端的CVS根目录,不要使用 softlink。
Description:
When cvs repository is a softlink, cvs cannot create lock. The assertion in lock.c line 177 fails.
The problem is that it compares the link path as a root of real path. This fails. It should convert link path to real path first. However this only happens sometimes, so the check should be made first wether real path is necessary.
How-To-Repeat:
Setup cvs server. The root of all cvs repositories is /cvsroot.
Create a cvs repository in let say /tmp/foo.
Create softlink for /tmp/foo in /cvsroot.
Try to checkout /cvsroot/foo. This should work.
Commit file in /cvsroot/foo.
Branch file in /cvsroot/foo.
Tag branch in /cvsroot/foo.