40

我玩过 CVS 一点,对它的所有功能都不是最熟悉的,但对我来说,一个巨大的烦恼是尝试添加包含更多目录的新目录。运行“ cvs add”只添加当前目录的内容,使用“ cvs import”看起来也不正确,因为它仍然是我正在生成的所有代码(这个howto声称导入适用于第3方来源

你们知道有什么方法可以将给定目录中的所有内容递归地添加到当前的 CVS 项目中(或者如果 SVN 或 git 使这变得更容易)?

4

14 回答 14

74

我发现这非常有效:

首先,添加所有目录,但不添加任何名为“CVS”的目录:

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

然后添加所有文件,不包括 CVS 目录中的任何内容:

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

现在,如果有人能治愈在这个时代使用 CVS 的尴尬......

于 2011-03-01T17:31:37.773 回答
11

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

find . -type f -print0| xargs -0 cvs add
于 2008-08-07T20:22:32.807 回答
10

我用这个:

首先递归地添加所有目录而不是 CVS 目录:

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

其次添加所有文件,减少 CVS 目录:

寻找 。\( -type d -name CVS -prune \) -o \( -type f -exec cvs add '{}' \; \)

第三做“提交”像“第一版”评论一样递归:

寻找 。\( -type d -name CVS -prune \) -o \( -type f -exec cvs commit -m "第一个版本" '{}' \; \)

最后以递归方式标记所有内容:

寻找 。\( -type d -name CVS -prune \) -o \( -type f -exec cvs tag -F MY_CVS_TAG '{}' \; \)
于 2014-07-17T08:21:44.183 回答
6

首先将所有目录添加到CVS

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

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

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

为我工作

于 2010-10-05T08:46:33.920 回答
2

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

于 2008-08-29T21:28:58.483 回答
2

请注意,您只能cvs add在位于已签出的工作副本中的文件和文件夹上使用,否则您将收到“无法打开 CVS/Entries for reading”消息。cvs add在这个 WinCVS 常见问题项目中解释了一种用于创建新“根模块”的技术:http: //cvsgui.sourceforge.net/newfaq.htm#add_rootmodule

如果您在 Windows 上,TortoiseCVS 和 WinCVS 都支持在单个操作中递归添加(和可选提交)多个文件。在 WinCvs 中查找宏 Add>Recursive Add (auto-commit)... 在 Tortoise 中,在目录上使用 Add Contents 命令。两者都允许您选择要添加的文件以及为它们使用的关键字扩展模式(主要用于定义哪些文件是二进制文件)。

有关 WinCvs 中递归添加的更多信息,请参见此处:http ://cvsgui.sourceforge.net/newfaq.htm#cvs-add_recursive


除此之外,它cvs import非常适合大量添加。然而,cvs import在 vanilla CVS 中实现的方式有两个缺点(因为它最初是为第三方代码编写的):

  • 它创建了一个具有特殊语义的强制分支。
  • 它不会创建将导入的代码建立为签出工作副本所需的存储库元数据(即隐藏的 CVS 目录),这意味着为了实际处理导入的文件,您首先必须将它们签出存储库

如果您使用 CVSNT,您可以通过指定-nC导入选项来避免这两个缺点。-n用于避免“供应商”分支并-C用于创建 CVS 目录。

于 2008-11-06T10:38:05.037 回答
2

Mark 的这个回答很有用(find . -type f -print0| xargs -0 cvs add),但我解决了当 cvs add 尝试添加他自己的文件(如标签、条目等)时发生的一些问题。

  1. 添加名为 NEW_FOLDER 的最高级别文件夹
cvs 添加 NEW_FOLDER
  1. 使用带有某些排除项的上一个命令添加所有子文件夹树

找到 NEW_FOLDER/ -type d !-名称“CVS” -和!-名称“标签” -和!-name "Entries.Log" -and ! -name "条目" -and ! -name "存储库" -and ! -name“根”-print0 | xargs -0 简历添加

  1. 使用带有某些排除项的上一个命令添加所有文件

找到 NEW_FOLDER/ -type f !-名称“CVS” -和!-名称“标签” -和!-name "Entries.Log" -and ! -name "条目" -and ! -name "存储库" -and ! -name“根”-print0 | xargs -0 简历添加

于 2016-06-07T09:29:25.550 回答
1

我认为这就是我在 CVS 时代所做的事情:

find . -type f | xargs cvs add
于 2008-08-07T18:25:47.470 回答
1

首先将所有目录添加到CVS

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

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

find . -type f -print0| xargs -0 cvs add
于 2008-08-29T18:06:37.067 回答
1

我正在使用这个简单的 shell 脚本,它应该从一个已经签出的 CVS 目录开始。它会愚蠢地尝试添加/提交它在递归搜索中找到的任何文件和目录,所以最后你应该得到一个完全提交树。

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

#!/bin/sh
# @(#) 递归添加文件和目录到当前CVS目录
# (c) 2009 年 Dirk Jagdmann

如果 [ -z "$1" ] ; 然后
    echo "用法:cvsadd '导入消息'"
    1号出口
菲

如果 [ -d "$2" ] ; 然后
    简历添加“$ 2”
    cd "$2" || 1号出口
菲

如果 [ !-d CVS ] ; 然后
    echo "当前目录需要包含一个 CVS/ 目录"
    1号出口
菲

XARGS="xargs -0 -r -t -L 1"

# 首先添加当前目录下的所有文件
寻找 。-maxdepth 1 -type f -print0 | $XARGS 简历添加
寻找 。-maxdepth 1 -type f -print0 | $XARGS cvs ci -m "$1"

# 然后添加所有目录
寻找 。-maxdepth 1 -type d -not -name CVS -a -not -name 。-print0 | $XARGS "$0" "$1"
于 2009-12-30T11:39:53.133 回答
1

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

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

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'

使用这种方法,我们将避免此类错误:

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
于 2014-07-03T07:58:54.657 回答
0

马克的解决方案解决了空格问题,但产生了这个问题:

cvs 添加:无法打开 CVS/Entries 进行读取:没有这样的文件或目录
cvs [添加中止]:没有存储库

要修复它,实际使用的命令是:

find . -type f -exec cvs add {} \;
于 2008-08-07T21:18:18.933 回答
0

我喜欢做(因为目录需要添加)

cvs status 2>/dev/null | awk '{if ($1=="?")system("cvs add "$2)}'

您可能需要多次运行(首先是目录,然后是其子目录),直到没有输出

于 2013-07-18T10:20:08.350 回答
-2

SVN 确实完成了这项微不足道的任务,但是使用像 Tortoise 这样的 GUI 更加容易。

这可能是一个很好的起点:http ://www-mrsrl.stanford.edu/~brian/cvstutorial/

于 2008-08-07T18:08:54.620 回答