如何递归添加CVS目录

我已经玩过一些CVS,并不是最熟悉它的所有功能,但对我来说,一个巨大的烦恼是试图添加包含更多目录的新目录。运行“ cvs add ”只会添加当前目录的内容,而使用“ cvs import ”看起来不是正确的,因为它仍然是所有代码,生产(这个howto声明导入用于第三方来源

你们知道任何方式递归地将一个给定的目录中的所有内容添加到当前的CVS项目(或者如果SVN或git使这显然更容易)?

0
是的,SVN和git在递归包含目录方面都比较容易。
额外 作者 dokaspar,

14 答案

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

find . -type f | xargs cvs add
0
额外

啊,空间。这将与空间一起工作:

find . -type f -print0| xargs -0 cvs add
0
额外
您实际上必须确保您不要将名为'CVS'的目录添加到CVS中,出于某种原因,CVS有时会捕获这些目录,有时它不会。运行它而不是:find。 \! -name“CVS” - 和\! -name“条目” - 和\! -name“知识库” - 和\! -name“Root”-ty
额外 作者 Chris Bunch,
虽然这是一个好的开始,但它需要很多排除才能充分有用。
额外 作者 awm,

SVN绝对会做这个小事,但是使用像Tortoise这样的GUI更容易。

This might be a good place to start: http://www-mrsrl.stanford.edu/~brian/cvstutorial/

0
额外

Mark's solution resolves the spaces issue, but produces this issue:

cvs add: cannot open CVS/Entries for reading: No such file or directory
cvs [add aborted]: no repository

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

find . -type f -exec cvs add {} \;
0
额外

首先将所有目录添加到CVS

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

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

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

cvs import is not just for 3rd-party sources. In fact, directories are not versioned by CVS, so they are not a subject to branch policies. As long as you import empty directories, it is fine.

0
额外

Note that you can only use cvs add on files and folders that are located inside an already checked out working copy, otherwise you will get the "Cannot open CVS/Entries for reading" message. A technique for creating a new "root module" using cvs add is explained in this WinCVS FAQ item: http://cvsgui.sourceforge.net/newfaq.htm#add_rootmodule

If you are on Windows, both TortoiseCVS and WinCVS support recursive addition (and optional commit) of multiple files in a single operation. In WinCvs look for the macro Add>Recursive Add (auto-commit)... In Tortoise use the Add Contents command on a directory. Both will allow you to select which files to add and what keyword expansion modes to use for them (mostly used for defining which files are binary).

For further info about recursive add in WinCvs look here: http://cvsgui.sourceforge.net/newfaq.htm#cvs-add_recursive


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

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

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

0
额外

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

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

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

0
额外

我使用这个:

首先递归地添加所有目录少于CVS的目录:

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

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

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

第三呢?提交?递归地像“第一版”评论:

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 '{}' \; \)
0
额外
当我必须将现有项目上传到存储库时,我使用了它
额外 作者 manufosela,
非常有用的命令,但在什么情况下CVS提交递归是必需的,因为“cvs commit”将提交所有文件?
额外 作者 Gagan,
在Mac上:找到。 (-type d -name CVS -prune)-o(-type f!-name'.DS_Store'-exec cvs add'{}'\;)
额外 作者 sgarbesi,

我正在使用这个简单的shell脚本,它应该从已经签出的CVS目录中启动。它会愚蠢地尝试添加/提交其发现的任何文件和目录,在它的递归搜索,所以最后你应该用充分承诺树上结束。

只需将其保存为 / usr / bin / cvsadd ,并且不要忘记 chmod + x / usr / bin / cvsadd

#!/bin/sh
# @(#) add files and directories recursively to the current CVS directory
# (c) 2009 by Dirk Jagdmann 

if [ -z "$1" ] ; then
    echo "usage: cvsadd 'import message'"
    exit 1
fi

if [ -d "$2" ] ; then
    cvs add "$2"
    cd "$2" || exit 1
fi

if [ ! -d CVS ] ; then
    echo "current directory needs to contain a CVS/ directory"
    exit 1
fi

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

# first add all files in current directory
find . -maxdepth 1 -type f -print0 | $XARGS cvs add
find . -maxdepth 1 -type f -print0 | $XARGS cvs ci -m "$1"

# then add all directories
find . -maxdepth 1 -type d -not -name CVS -a -not -name . -print0 | $XARGS "$0" "$1"
0
额外

首先将所有目录添加到CVS

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

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

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

为我工作

0
额外
不排除CVS文件夹中的文件。
额外 作者 Jay Elston,

我发现这个工作非常有效:

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

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

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

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

现在,如果有人能够在今天和这个年龄段使用CVS的尴尬......

0
额外
我在一个包含数百个目录和数千个文件的目录层次结构上使用它,像魅力一样工作。谢谢!
额外 作者 Igor Oks,
cvs只是简单易用或1或2人无分支“备份”和“共享”源代码控制
额外 作者 awm,

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

我们使用选项 -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
0
额外

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

  1. 添加名为NEW_FOLDER的最高级文件夹
cvs add NEW_FOLDER
  1. 使用前面的命令进行排除,添加所有子文件夹树

找到NEW_FOLDER / -type d!名称“CVS” - 和!名“标签” - 和! -name“Entries.Log” - 和! -name“条目” - 和!名称“存储库” - 和! -name“Root”-print0 | xargs -0 cvs add

  1. 使用前面的命令进行一些排除来添加所有文件

找到NEW_FOLDER / -type f!名称“CVS” - 和!名“标签” - 和! -name“Entries.Log” - 和! -name“条目” - 和!名称“存储库” - 和! -name“Root”-print0 | xargs -0 cvs add

0
额外