【问题标题】:How to add CVS directories recursively如何递归添加 CVS 目录
【发布时间】:2008-08-07 18:05:28
【问题描述】:

我对 CVS 进行了一些尝试,但对它的所有功能并不是最熟悉的,但对我来说,一个巨大的烦恼是尝试添加包含更多目录的新目录。运行“cvs add”只会添加当前目录的内容,而使用“cvs import”看起来也不对,因为它仍然是我正在生成的所有代码(此howto 声称导入适用于3rd party sources )

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

【问题讨论】:

  • 是的,SVN 和 git 都更容易递归地包含目录。

标签: cvs


【解决方案1】:

我发现这非常有效:

首先,添加所有目录,但不要添加任何名为“CVS”的目录:

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

然后添加所有文件,不包括 CVS 目录中的任何内容:

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

现在,如果有人能治愈在当今时代使用 CVS 的尴尬......

【讨论】:

  • 我在具有数百个目录和数千个文件的目录层次结构中使用它,就像一个魅力。谢谢!
  • cvs 只是简单易用或 1 或 2 人的非分支“备份”和“共享”源代码控制
【解决方案2】:

啊,空格。这适用于空格:

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

【讨论】:

  • 您实际上必须确保不要将名为“CVS”的目录添加到 cvs,因为某些原因 cvs 有时会捕获到这一点,有时则不会。改为运行: find . \! -name "CVS" - 和 \! -name "条目" -and \! -name "存储库" -and \! -name“根”-ty
  • 虽然这是一个好的开始,但它需要很多排除项才能完全有用。
【解决方案3】:

我用这个:

首先递归添加除 CVS 之外的所有目录:

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

第二次添加所有文件,减少 CVS 目录:

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

第三次“提交”递归地像“第一个版本”评论:

 找到 . \( -type d -name CVS -prune \) -o \( -type f -exec cvs commit -m "第一个版本" '{}' \; \)

最后全部递归标记:

 找到 . \( -type d -name CVS -prune \) -o \( -type f -exec cvs tag -F MY_CVS_TAG '{}' \; \)

【讨论】:

  • 在 Mac 上:查找 . ( -type d -name CVS -prune ) -o ( -type f ! -name '.DS_Store' -exec cvs add '{}' \; )
  • 非常有用的命令,但在什么情况下需要 CVS 递归提交,因为“cvs commit”会提交所有文件?
  • 我在需要将现有项目上传到存储库时使用它
【解决方案4】:

首先将所有目录添加到CVS

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

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

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

为我工作

【讨论】:

  • 不排除 CVS 文件夹中的文件。
【解决方案5】:

cvs import 不仅适用于第三方来源。事实上,CVS 没有对目录进行版本控制,因此它们不受分支策略的约束。只要导入空目录就可以了。

【讨论】:

    【解决方案6】:

    请注意,您只能对位于已签出工作副本内的文件和文件夹使用cvs add,否则您将收到"Cannot open CVS/Entries for reading" 消息。使用cvs add 创建新“根模块”的技术在此 WinCVS 常见问题解答项目中进行了说明:http://cvsgui.sourceforge.net/newfaq.htm#add_rootmodule

    如果您在 Windows 上,TortoiseCVS 和 WinCVS 都支持在单个操作中递归添加(和可选提交)多个文件。在 WinCvs 中查找宏 Add>Recursive Add (auto-commit)... 在 Tortoise 中,在目录上使用 Add Contents 命令。两者都允许您选择要添加的文件以及为它们使用的关键字扩展模式(主要用于定义哪些文件是二进制文件)。

    有关在 WinCvs 中递归添加的更多信息,请看这里:http://cvsgui.sourceforge.net/newfaq.htm#cvs-add_recursive


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

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

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

    【讨论】:

      【解决方案7】:

      Mark 的这个回答很有用(find . -type f -print0| xargs -0 cvs add),但我解决了一些在 cvs add 尝试添加他自己的文件(如标签、条目等)时出现的问题。

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

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

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

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

      【讨论】:

        【解决方案8】:

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

        find . -type f | xargs cvs add
        

        【讨论】:

          【解决方案9】:

          首先将所有目录添加到CVS

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

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

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

          【讨论】:

            【解决方案10】:

            我正在使用这个简单的 shell 脚本,它应该从一个已经签出的 CVS 目录启动。它会愚蠢地尝试添加/提交它在递归搜索中找到的任何文件和目录,所以最终你应该得到一个完全提交树。

            只需将其保存为/usr/bin/cvsadd 之类的名称,不要忘记chmod +x /usr/bin/cvsadd

            #!/bin/sh # @(#) 递归添加文件和目录到当前CVS目录 # (c) 2009 年 Dirk Jagdmann 如果 [ -z "$1" ] ;然后 echo "用法:cvsadd '导入消息'" 1号出口 菲 如果 [ -d "$2" ] ;然后 简历添加“$ 2” cd "$2" || 1号出口 菲 如果 [ ! -d CVS ] ;然后 echo "当前目录需要包含一个 CVS/ 目录" 1号出口 菲 XARGS="xargs -0 -r -t -L 1" # 首先添加当前目录下的所有文件 寻找 。 -maxdepth 1 -type f -print0 | $XARGS 简历添加 寻找 。 -maxdepth 1 -type f -print0 | $XARGS cvs ci -m "$1" # 然后添加所有目录 寻找 。 -maxdepth 1 -type d -not -name CVS -a -not -name 。 -print0 | $XARGS "$0" "$1"

            【讨论】:

              【解决方案11】:

              已经讨论过的方法会进行递归查找,但如果您再次执行相同的操作,它将失败(如果您想将子树添加到现有树) 因此,您需要检查您的目录是否尚未添加,然后仅添加尚未添加的文件。为此,我们使用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
              

              【讨论】:

                【解决方案12】:

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

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

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

                【讨论】:

                  【解决方案13】:

                  Mark's solution 解决了空格问题,但产生了这个问题:

                  cvs add: 无法打开 CVS/Entries for 阅读:没有这样的文件或目录
                  cvs [添加中止]:没有存储库

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

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

                  【讨论】:

                    【解决方案14】:

                    SVN 确实完成了这项微不足道的任务,但是使用像 Tortoise 这样的 GUI 更加容易。

                    这可能是一个不错的起点:http://www-mrsrl.stanford.edu/~brian/cvstutorial/

                    【讨论】:

                      猜你喜欢
                      • 1970-01-01
                      • 1970-01-01
                      • 2010-10-14
                      • 1970-01-01
                      • 2015-04-14
                      • 1970-01-01
                      • 2020-12-19
                      • 1970-01-01
                      • 2017-09-29
                      相关资源
                      最近更新 更多