如何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等)时发生的一些问题。

  1. 添加名为NEW_FOLDER的最高级文件夹
  cvs添加NEW_FOLDER 
  1. 使用一些排除的前面的命令来添加所有的子文件夹树

findNEW_FOLDER / -type d! 名“CVS” – 和! 名“标签” – 和! -name“Entries.Log” – 和! -name“条目” – 和! -name“存储库” – 和! -name“root”-print0 | xargs -0 cvs add

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

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/