题
我稍微使用过 CVS,并不是最熟悉它的所有功能,但对我来说一个巨大的烦恼是尝试添加包含更多目录的新目录。跑步 ”cvs add
" 只添加当前目录的内容,并使用 "cvs import
“看起来也不像是正确的事情,因为它仍然是我正在生成的所有代码(这个howto声称导入是为了 第三方来源)
你们知道有什么方法可以将给定目录中的所有内容递归地添加到当前 CVS 项目中(或者 SVN 或 git 是否使这变得更加容易)?
解决方案
啊,空格。这适用于空格:
find . -type f -print0| xargs -0 cvs add
其他提示
我发现这非常有效:
首先,添加所有目录,但不添加任何名为“CVS”的目录:
find . -type d \! -name CVS -exec cvs add '{}' \;
然后添加所有文件,不包括 CVS 目录中的任何文件:
find . \( -type d -name CVS -prune \) -o \( -type f -exec cvs add '{}' \; \)
现在,如果有人能解决当今时代使用 CVS 的尴尬问题的话……
我用这个:
首先递归添加所有目录减去 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 '{}' \; \)
首先将所有目录添加到CVS中
find . -type d -print0| xargs -0 cvs add
然后将目录下的所有文件添加到CVS中
find . -type f | grep -v CVS | xargs cvs add
为我工作
cvs import
不仅仅适用于第三方来源。事实上,目录不由 CVS 进行版本控制,因此它们不受分支策略的约束。只要导入空目录就可以了。
请注意,您只能使用 cvs add
位于已签出的工作副本内的文件和文件夹,否则您将得到 “无法打开 CVS/条目进行阅读” 信息。一种使用以下方法创建新“根模块”的技术 cvs add
WinCVS 常见问题解答项目中对此进行了解释: http://cvsgui.sourceforge.net/newfaq.htm#add_rootmodule
如果您使用的是 Windows,TortoiseCVS 和 WinCVS 都支持在单个操作中递归添加(和可选提交)多个文件。在 WinCvs 中查找宏 Add>Recursive Add (auto-commit)...在 Tortoise 中,对目录使用“添加内容”命令。两者都允许您选择要添加的文件以及要使用的关键字扩展模式(主要用于定义哪些文件是二进制文件)。
有关 WinCvs 中递归添加的更多信息,请参见此处: http://cvsgui.sourceforge.net/newfaq.htm#cvs-add_recursive
除此之外 cvs import
非常适合批量添加。然而,方式 cvs import
在普通 CVS 中实现有两个缺点(因为它 曾是 最初是为第三方代码编写的):
- 它创建一个具有特殊语义的强制分支。
- 它不会创建存储库元数据(即隐藏的 CVS 目录)需要将导入的代码建立为签出的工作副本,这意味着为了实际使用导入的文件,您首先必须将它们从存储库中签出
如果您使用 CVSNT,您可以通过指定来避免这两个缺点 -nC
导入选项。 -n
用于避免“供应商”分支并且 -C
用于创建 CVS 目录。
马克的这个答案很有用(查找 .-type f -print0 | XARGS -0 CVS添加),但是我解决了CVS添加时尝试添加自己的文件时发生的一些问题,例如标签,条目,ECT ..
- 添加名为 NEW_FOLDER 的最高级别文件夹
cvs add NEW_FOLDER
- 使用上一个命令并进行一些排除来添加所有子文件夹树
找到 NEW_FOLDER/ -type d !-名称“CVS” -并且!-名称“标签” -并且!-名称“Entries.Log”-和!-名称“条目”-并且!-名称“存储库” -并且!-Name“ root” -print0 | XARGS -0 CVS添加
- 使用上一个命令并进行一些排除来添加所有文件
找到 NEW_FOLDER/ -输入 f !-名称“CVS” -并且!-名称“标签” -并且!-名称“Entries.Log”-和!-名称“条目”-并且!-名称“存储库” -并且!-Name“ root” -print0 | XARGS -0 CVS添加
我想这就是我在 CVS 时代所做的事情:
find . -type f | xargs cvs add
首先将所有目录添加到CVS中
find . -type d -print0| xargs -0 cvs add
然后将目录下的所有文件添加到CVS中
find . -type f -print0| xargs -0 cvs add
我正在使用这个简单的 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"
已经讨论过的方法会进行递归查找,但是如果您再次执行相同的操作(如果要将子树添加到存在的树中)将失败添加了。为此,我们使用输出 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
我喜欢这样做(因为目录需要添加)
cvs status 2>/dev/null | awk '{if ($1=="?")system("cvs add "$2)}'
您可能需要多次运行此命令(首先针对目录,然后针对其子目录),直到没有输出
马克的解决方案 解决了空间问题,但产生了这个问题:
简历添加:无法打开CVS/条目进行阅读:没有这样的文件或目录
CVS [添加中止]:没有存储库
要修复它,实际使用的命令是:
find . -type f -exec cvs add {} \;
SVN 确实使这个琐碎的任务变得简单,但是使用像 Tortoise 这样的 GUI 甚至更容易。
这可能是一个很好的起点: http://www-mrsrl.stanford.edu/~brian/cvstutorial/