我稍微接触过CVS,但并不是很熟悉它的所有能力。对我来说最大的烦恼是尝试添加包含更多子目录的新目录。运行“cvs add
”仅会添加当前目录的内容,使用“cvs import
”也不像正确的方法,因为这仍然是我正在编写的所有代码(这篇教程声称导入是针对第三方源的)。
你们知道如何递归地添加给定目录中的所有内容到当前的CVS项目中吗?或者SVN或git是否可以更容易地实现此操作?
我发现这个方法相当有效:
首先,添加所有的目录,但不包括名为"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 '{}' \; \)
第三步递归执行“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 '{}' \; \)
啊,空格。这将适用于空格:
find . -type f -print0| xargs -0 cvs add
首先将所有目录添加到CVS中
find . -type d -print0| xargs -0 cvs add
然后将目录中的所有文件添加到CVS中
find . -type f | grep -v CVS | xargs cvs add
Mark的回答很有用(find . -type f -print0 | xargs -0 cvs add),但是当cvs add尝试添加自己的文件(如Tag,Entries等)时,我解决了一些问题。
cvs add NEW_FOLDER
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
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
cvs import
非常适合于批量添加。然而,在原始的CVS中实现cvs import
有两个缺点(因为它最初是为第三方代码编写的):
-nC
选项来避免这两个缺点。-n
用于避免“供应商”分支,-C
用于创建CVS目录。cvs import
不仅适用于第三方源代码。实际上,CVS不会对目录进行版本控制,因此它们不受分支策略的约束。只要您导入空目录,就可以了。
我们使用选项 -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
我正在使用这个简单的shell脚本,应该从已经检出的CVS目录中启动。它会愚蠢地尝试添加/提交任何它在递归搜索中找到的文件和目录,因此最终您应该得到一个完全提交的树。
只需将其保存为类似于/usr/bin/cvsadd
的东西,不要忘记chmod +x /usr/bin/cvsadd
。
我想这是我在使用CVS的时候所做的:
find . -type f | xargs cvs add