36

我不太确定这是怎么发生的,但不知何故,一个完全空的目录层次结构最终出现在我的存储库中:

com/
com/companyname/
com/companyname/blah/
com/sun/
com/sun/java/
com/sun/java/jax_rpc_ri/

我认为发生的事情是这些目录中确实有文件,但后来开发人员意识到他/她不应该首先签入它们,因为这些是构建过程的副产品,所以他/她删除了文件,但不知何故,空目录作为古代遗物留在存储库中。

如何从 CVS 中删除它?我似乎能够在谷歌上找到的唯一结果是不需要删除空目录,因为 CVS 首先不会保留它们,并且-P(prune) 选项cvs update应该将它们从工作目录 - 如果您的存储库中实际上有空目录,这将是零帮助。

Acvs remove并且cvs commit似乎没有处理这种情况:

$ cvs remove -Rf com
cvs remove: Removing com
cvs remove: Removing com/companyname
cvs remove: Removing com/companyname/blah
cvs remove: Removing com/sun
cvs remove: Removing com/sun/java
cvs remove: Removing com/sun/java/jax_rpc_ri
$ cvs commit com
cvs commit: Examining com
cvs commit: Examining com/companyname
cvs commit: Examining com/companyname/blah
cvs commit: Examining com/sun
cvs commit: Examining com/sun/java
cvs commit: Examining com/sun/java/jax_rpc_ri
$ ls -l com
total 24
drwxrwxr-x  2 matt matt 4096 Oct 15 14:38 CVS
drwxrwxr-x  9 matt matt 4096 Oct 15 14:38 companyname
drwxrwxr-x  4 matt matt 4096 Oct 15 14:38 sun

它还在那里!

SVN 也有这种奇怪的行为吗?

4

7 回答 7

38

AFAIK CVS 协议不允许删除目录。您应该转到服务器控制台并将它们从真实的物理存储库中删除。


http://www.network-theory.co.uk/docs/cvsmanual/Removingdirectories.html

您不会删除目录本身;没有办法做到这一点。

于 2008-10-15T14:54:04.603 回答
22

CVS 签出和更新总是会签出空目录;这就是 CVS 的构建方式。使用 "-P" -- "prune" -- 进行更新以删除空目录:

cvs update -dP

(添加“-d”将更新自上次更新后出现的新目录;否则,CVS 将忽略它们。)

于 2008-10-15T14:55:45.130 回答
8

刚做了

  1. rm -rvf /localCopy/project/emptyDirectory
  2. 编辑/localCopy/project/CVS/Entries,删除行D/emptyDirectory////,保存文件
  3. rmdir -v /CVSROOT/project/emptyDirectory

摆脱项目中的emptyDirectory。承认弄乱内部 CVS 数据是不合法的,但似乎有效(cvs 版本 1.12.13)。

于 2009-11-04T14:03:57.997 回答
4

CVS 有许多设计缺陷,永远无法在不丢失历史记录的情况下摆脱目录就是其中之一。在不丢失历史记录的情况下重命名文件和目录是另一个问题。

考虑毕业到Subversioncvs2svn在转换包括所有分支和标签的存储库方面做得非常好。CVS 和 SVN 命令集非常相似,只需要很少的调整。(为了防止这成为“你应该使用什么版本控制”之战)一旦你使用了 SVN,你就可以转移到任何数量的更高级的版本控制系统,比如gitSVK

于 2008-10-15T15:25:32.480 回答
4

这对我有用。基本上当你做

rmdir -v /CVSROOT/project/emptyDirectory # 我们正在从 CVS 存储库目录中删除目录。

如果您具有存储库 unix 服务器登录访问权限,则可以前往该路径并删除该目录,或者向 unix 团队提出同样的问题。

于 2010-10-08T12:47:38.323 回答
1

cvs 倾向于对目录采用两阶段方法,这就是为什么许多 cvs 命令有一个 -P 选项来“修剪空目录”。

发生这种情况时,例如要重命名我刚刚添加的目录,我删除该目录,删除 CVS/Entries 文件中目录的条目,它将是一个以“D”开头的行。

任务完成。

如果我已经提交,我确保包含空目录/ies 的当前工作区都已签入。然后我将添加目录的工作区部分吹走。

例如,在

~/Sandbox/my_project/some_stuff_i_want
~/Sandbox/my_project/empty_dir_1
~/Sandbox/my_project/other_stuff_i_want

我确保两个目录中的所有内容都是最新的,其中包含我想要保留的内容。然后我从我的沙箱中吹走 my_project。

然后我从存储库本身中删除空目录。

返回并检查相同的工作区,例如 my_project 将为我提供没有空目录的工作区。

或者只是保留所有内容并使用 -P 选项让 CVS 检查所有内容(或更新所有内容),然后删除空目录。

高温高压

干杯,

于 2008-10-15T15:07:47.727 回答
1

您无法从工作区中删除目录,您需要将其从保存实际存储库的服务器中删除。但是您可以使用 cvs remove 命令从目录中删除文件。

于 2014-01-27T10:58:59.127 回答