如何recursion添加CVS目录
我已经玩过一些CVS,并不是最熟悉它的所有function,但对我来说,一个巨大的烦恼是试图添加包含更多目录的新目录。 运行“ cvs add
”只会添加当前目录的内容,而使用“ cvs import
”看起来不是正确的东西,因为它仍然是我正在生成的所有代码(这个howto声明导入是针对第三方来源的 )
你们知道任何方式recursion地添加一个给定的目录中的一切到当前的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的尴尬…
我使用这个:
首先recursion地添加所有目录less于CVS的目录:
$> find . -type d \! -name CVS -exec cvs add '{}' \;
其次添加所有文件,less于CVS目录:
找 。 \(-type d -name CVS -prune \)-o \(-type f -exec cvs add'{}'\; \)
第三,像“第一版本”评论recursion地“递交”:
找 。 \(-type d -name CVS -prune \)-o \(-type f -exec cvs commit -m“first version”'{}'\; \)
最后recursion标记全部:
找 。 \(-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 / Entries for reading”消息。 WinCVS常见问题项目中介绍了使用cvs add
来创build新的“root module”的技巧: http : //cvsgui.sourceforge.net/newfaq.htm#add_rootmodule
如果你在Windows上,TortoiseCVS和WinCVS都支持在单个操作中recursion添加(和可选提交)多个文件。 在WinCvs中查找macrosAdd→Recursive Add(auto-commit)…在Tortoise中使用目录中的Add Contents命令。 两者都将允许您select要添加哪些文件以及使用哪些关键字扩展模式(主要用于定义哪些文件是二进制文件)。
有关recursion添加WinCvs的更多信息,请看这里: http : //cvsgui.sourceforge.net/newfaq.htm#cvs-add_recursive
除此之外, cvs import
非常适合大量添加。 然而, cvs import
在vanilla CVS中的实现方式有两个缺点(因为它最初是为第三方代码编写的):
- 它创build一个具有特殊语义的强制性分支。
- 它不会创build需要将导入的代码build立为签出的工作副本的存储库元数据(即隐藏的CVS目录),这意味着为了实际使用导入的文件,首先必须检查它们知识库
如果您正在使用CVSNT,则可以通过在导入时指定-nC
选项来避免这两个缺点。 -n
用于避免“供应商”分支, -C
用于创buildCVS目录。
首先将所有目录添加到CVS
find . -type d -print0| xargs -0 cvs add
然后将目录中的所有文件添加到CVS
find . -type f -print0| xargs -0 cvs add
我正在使用这个简单的shell脚本,它应该从已经签出的CVS目录中启动。 它会愚蠢地尝试添加/提交它在recursionsearch时发现的任何文件和目录,所以最后你应该完成一个完整的提交树。
只需将其保存为/usr/bin/cvsadd
并且不要忘记chmod +x /usr/bin/cvsadd
。
#!/ bin / sh的 #@(#)recursion地将文件和目录添加到当前的CVS目录 #(c)2009由Dirk Jagdmann 如果[-z“$ 1”]; 然后 回声“用法:cvsadd'导入消息'” 出口1 科幻 如果[-d“$ 2”]; 然后 cvs添加“$ 2” cd“$ 2”|| 出口1 科幻 如果[! -d CVS]; 然后 echo“当前目录需要包含一个CVS /目录” 出口1 科幻 XARGS =“xargs -0 -r -t -L 1” #首先添加当前目录中的所有文件 找 。 -maxdepth 1 -type f -print0 | $ XARGS cvs add 找 。 -maxdepth 1 -type f -print0 | $ XARGS cvs ci -m“$ 1” #然后添加所有的目录 找 。 -maxdepth 1 -type d -not -name CVS -a -not -name。 -print0 | $ XARGS“$ 0”“$ 1”
已经讨论过的方法会进行recursion查找,但是如果再次执行相同的操作(如果要将子树添加到现有的树中),则会失败。因此,您需要检查目录是否尚未添加,然后只添加那些不是添加了。 为了做到这一点,我们使用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
这个来自Mark的答案是有用的(find。-type f -print0 | xargs -0 cvs add),但是我解决了当cvs add尝试添加他自己的文件(如Tag,Entries等)时发生的一些问题。
- 添加名为NEW_FOLDER的最高级文件夹
cvs添加NEW_FOLDER
- 使用一些排除的前面的命令来添加所有的子文件夹树
findNEW_FOLDER / -type d! 名“CVS” – 和! 名“标签” – 和! -name“Entries.Log” – 和! -name“条目” – 和! -name“存储库” – 和! -name“root”-print0 | xargs -0 cvs add
- 使用前面的命令进行一些排除来添加所有文件
findNEW_FOLDER / -type f! 名“CVS” – 和! 名“标签” – 和! -name“Entries.Log” – 和! -name“条目” – 和! -name“存储库” – 和! -name“root”-print0 | xargs -0 cvs add
我想这就是我在CVS时代所做的:
find . -type f | xargs cvs add
我喜欢做(因为目录需要添加)
cvs status 2>/dev/null | awk '{if ($1=="?")system("cvs add "$2)}'
您可能需要多次运行(首先是目录的子目录),直到没有输出为止
马克的解决scheme解决了空间问题,但产生这个问题:
cvs add:无法打开CVS / Entries for reading:没有这样的文件或目录
cvs [add aborted]:没有存储库
要修复它,使用的实际命令是:
find . -type f -exec cvs add {} \;
SVN绝对会做这个小事,使用像Tortoise这样的GUI更容易。
这可能是一个很好的开始: http : //www-mrsrl.stanford.edu/~brian/cvstutorial/