如何递归地添加CVS目录

40

我稍微接触过CVS,但并不是很熟悉它的所有能力。对我来说最大的烦恼是尝试添加包含更多子目录的新目录。运行“cvs add”仅会添加当前目录的内容,使用“cvs import”也不像正确的方法,因为这仍然是我正在编写的所有代码(这篇教程声称导入是针对第三方源的)。

你们知道如何递归地添加给定目录中的所有内容到当前的CVS项目中吗?或者SVN或git是否可以更容易地实现此操作?


3
是的,SVN和git都可以轻松地递归包含目录。 - dokaspar
14个回答

75

我发现这个方法相当有效:

首先,添加所有的目录,但不包括名为"CVS"的任何目录:

find . -type d \! -name CVS -exec cvs add '{}' \;

然后添加所有文件,排除 CVS 目录中的任何内容:

find . \( -type d -name CVS -prune \) -o \( -type f -exec cvs add '{}' \; \)

现在,如果有人有治疗在如今这个时代使用CVS所带来的尴尬的方法...


3
我在一个有数百个目录和数千个文件的目录层次结构上使用了它,效果非常好。谢谢! - Igor
3
CVS很容易使用,适用于简单的备份和共享源代码控制,适合1-2人非分支团队。 - awm

11

我使用这个:

首先递归添加所有目录,但不包括CVS目录:

$> find . -type d \! -name CVS -exec cvs add '{}' \;

第二步添加所有文件,除了CVS目录:

 find . \( -type d -name CVS -prune \) -o \( -type f -exec cvs add '{}' \; \)

第三步递归执行“commit”,注释为“first version”:

 find . \( -type d -name CVS -prune \) -o \( -type f -exec cvs commit -m "first version" '{}' \; \)

最后递归标记所有文件:

 find . \( -type d -name CVS -prune \) -o \( -type f -exec cvs tag -F MY_CVS_TAG '{}' \; \)

1
在Mac上:查找。 (-type d -name CVS -prune \)-o(-type f!-name'.DS_Store' -exec cvs add '{}' ; \) - sgarbesi
非常有用的命令,但在什么情况下需要递归地进行CVS提交,因为“cvs commit”将提交所有文件? - Gagan
我在将现有项目上传到代码库时使用了它。 - manufosela

11

啊,空格。这将适用于空格:

find . -type f -print0| xargs -0 cvs add

7
为确保不出错,您必须确保不将名为“CVS”的目录添加到cvs中。由于某种原因,有时cvs会捕捉到它,有时则不会。改用以下命令:find . ! -name "CVS" -and ! -name "Entries" -and ! -name "Repository" -and ! -name "Root" -ty - Chris Bunch
虽然这是一个不错的开始,但它需要很多排除才能完全有用。 - awm

6

首先将所有目录添加到CVS中

find . -type d -print0| xargs -0 cvs add

然后将目录中的所有文件添加到CVS中

find . -type f | grep -v CVS | xargs cvs add

适用于我。

不要排除CVS文件夹中的文件。 - Jay Elston

2

Mark的回答很有用(find . -type f -print0 | xargs -0 cvs add),但是当cvs add尝试添加自己的文件(如Tag,Entries等)时,我解决了一些问题。

  1. 添加名为NEW_FOLDER的最高级别文件夹
cvs add NEW_FOLDER
  1. 使用上一个命令并排除一些内容以添加所有子文件夹树

find NEW_FOLDER/ -type d ! -name "CVS" -and ! -name "Tag" -and ! -name "Entries.Log" -and ! -name "Entries" -and ! -name "Repository" -and ! -name "Root" -print0 | xargs -0 cvs add

  1. 使用上一个命令并排除一些内容以添加所有文件

find NEW_FOLDER/ -type f ! -name "CVS" -and ! -name "Tag" -and ! -name "Entries.Log" -and ! -name "Entries" -and ! -name "Repository" -and ! -name "Root" -print0 | xargs -0 cvs add


2
请注意,您只能在已经检出的工作副本中使用添加文件和文件夹,否则您将收到“无法打开CVS / Entries进行读取”的消息。使用创建新的“根模块”的技术在WinCVS常见问题解答项中有解释:http://cvsgui.sourceforge.net/newfaq.htm#add_rootmodule 如果您使用Windows,则TortoiseCVS和WinCVS都支持单个操作中多个文件的递归添加(和可选提交)。在WinCvs中查找宏Add> Recursive Add(自动提交)...在Tortoise中,在目录上使用Add Contents命令。两者都允许您选择要添加的文件以及要为其使用哪些关键字扩展模式(主要用于定义哪些文件是二进制文件)。
有关WinCvs中递归添加的更多信息,请参见此处:http://cvsgui.sourceforge.net/newfaq.htm#cvs-add_recursive
除此之外,cvs import非常适合于批量添加。然而,在原始的CVS中实现cvs import有两个缺点(因为它最初是为第三方代码编写的):
  • 它创建了一个具有特殊语义的强制分支。
  • 它不会创建存储库元数据(即隐藏的CVS目录),以建立导入的代码作为已检出的工作副本,这意味着为了实际使用导入的文件,您首先必须将其从存储库中检出。
如果您正在使用CVSNT,则可以通过在导入时指定-nC选项来避免这两个缺点。-n用于避免“供应商”分支,-C用于创建CVS目录。

2

cvs import 不仅适用于第三方源代码。实际上,CVS不会对目录进行版本控制,因此它们不受分支策略的约束。只要您导入空目录,就可以了。


1
已经讨论过的方法会进行递归查找,但如果您再次执行相同的操作(如果您想将子树添加到现有树中),则它将失败。因此,您需要检查您的目录尚未添加,然后仅添加尚未添加的文件。为此,我们使用 cvs up 的输出来查看哪些元素尚未添加-其行首将有一个问号。

我们使用选项 -0 , -print0 和 -zZ 以确保我们正确处理文件名中的空格。我们还使用--no-run-if-empty避免运行如果不需要添加任何内容。

<code><code>CVS_PATTERN=/tmp/cvs_pattern
cvs -z3 -q up | egrep '^\?.*' | sed -e 's/^? //' > $CVS_PATTERN
find . -type d \! -name CVS -print0 | grep -zZf $CVS_PATTERN | xargs -0 --no-run-if-empty cvs add
find . \( -type d  -name CVS -prune \) -o \( -type f  -print0 \) | grep -zZf $CVS_PATTERN | xargs -0 --no-run-if-empty cvs add
cvs commit -m 'commiting tree recursively'
</code></code>

采用这种方法,我们将避免出现这样的错误:

cvs add: cannot add special file `.'; skipping
cvs [add aborted]: there is a version in ./dirname1 already

并且

cvs add: `./dirname2/filename' already exists, with version number 1.1.1.1

1

我正在使用这个简单的shell脚本,应该从已经检出的CVS目录中启动。它会愚蠢地尝试添加/提交任何它在递归搜索中找到的文件和目录,因此最终您应该得到一个完全提交的树。

只需将其保存为类似于/usr/bin/cvsadd的东西,不要忘记chmod +x /usr/bin/cvsadd

#!/bin/sh # @(#) 递归地将文件和目录添加到当前的CVS目录中 # (c) 2009 Dirk Jagdmann
if [ -z "$1" ] ; then echo "用法: cvsadd '导入信息'" exit 1 fi
if [ -d "$2" ] ; then cvs add "$2" cd "$2" || exit 1 fi
if [ ! -d CVS ] ; then echo "当前目录需要包含一个CVS/目录" exit 1 fi
XARGS="xargs -0 -r -t -L 1"
# 首先添加当前目录中的所有文件 find . -maxdepth 1 -type f -print0 | $XARGS cvs add find . -maxdepth 1 -type f -print0 | $XARGS cvs ci -m "$1"
# 然后添加所有目录 find . -maxdepth 1 -type d -not -name CVS -a -not -name . -print0 | $XARGS "$0" "$1"

1

我想这是我在使用CVS的时候所做的:

find . -type f | xargs cvs add

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接