【问题标题】:Add all unversioned files to Subversion using one Linux command使用一个 Linux 命令将所有未版本控制的文件添加到 Subversion
【发布时间】:2009-08-02 05:40:38
【问题描述】:

有时我在项目的不同目录中包含许多文件。现在,我在提交之前将所有文件一一添加到我的项目中。是否有任何 Linux 终端命令可以将所有未版本化的文件添加到 Subversion?

如果我想添加除一两个文件之外的所有文件怎么办?

【问题讨论】:

标签: svn


【解决方案1】:
svn add --force <directory>

Add 已经是递归的。你只需要强制它遍历版本化的子目录。

【讨论】:

  • 嗨 cletus - 库下的共享对象似乎没有被添加。但是已经添加了头文件。例如,我有 xyz/usr/lib/a.so 和 xyz/include/a.h,当我执行 svn add --force xyz 时,它添加了 xyz、include 和 a.h,而它在 usr 和 lib 中停止了。
  • 然后我必须执行 svn add xyz/lib/* 来添加共享对象。它似乎对二进制可执行文件感到满意,但对共享对象不满意。同样,有 xyz/bin/bin1 其中 bin1 是二进制可执行文件。这个命令添加 bin1 没有问题,而它似乎对 so 不做同样的事情
【解决方案2】:

添加旁边带有问号的任何文件,同时仍排除被忽略的文件:

svn status | grep -v "^.[ \t]*\..*" | grep "^?" | awk '{print $2}' | xargs svn add
svn commit

http://codesnippets.joyent.com/posts/show/45

【讨论】:

  • 你好詹姆斯。抱歉,我对您的回答投了反对票,但这是一个错误。请编辑它,这样我就可以回滚这个不赞成票(以及这条评论)。
  • 我不知道为什么,但我相信你的正则表达式不关心包含空格的文件名......
  • svn 状态 | grep -v "^.[ \t]*\..*" | grep "^?" | awk '{打印 $2}' | xargs svn add && svn commit -m "test"
【解决方案3】:

此命令会将svn st 命令输出中列出的所有未版本控制的文件添加到 subversion。

请注意,在 svn stat 输出中包含空格的任何文件名都不会被添加。此外,如果任何文件名包含“?”,则可能会出现奇怪的行为。

svn st | grep ? | tr -s ' ' | cut -d ' ' -f 2 | xargs svn add

或者如果你擅长 awk:

svn st | grep ? | awk '{print $2}' | xargs svn add

解释:

第 1 步: svn st 命令

[user@xxx rails]$svn st
?       app/controllers/application.rb
M       app/views/layouts/application.html.erb
?       config/database.yml

第 2 步:我们使用 grep 命令 grep 未版本化的文件:

[user@xxx rails]$svn st | grep ?
?       app/controllers/application.rb
?       config/database.yml

第 3 步: 然后使用 tr 命令删除? 和文件路径之间的空格:

[user@xxx rails]$svn st | grep ? | tr -s ' '
? app/controllers/application.rb
? config/database.yml
</pre>

第 4 步:然后使用 cut 命令从输出中选择第二列:

[user@xxx rails]$svn st | grep ? | tr -s ' ' | cut -d ' ' -f 2
app/controllers/application.rb
config/database.yml

第 5 步:最后,将这些文件路径作为标准输入传递给svn add 命令:

[user@xxx rails]$svn st | grep ? | tr -s ' ' | cut -d ' ' -f 2 | xargs svn add
A       app/controllers/application.rb
A       config/database.yml

【讨论】:

  • 感谢您的解释!
【解决方案4】:

你们没有一个是完全正确的 我花了整整一个晚上来修复它,它在我的詹金斯中运行正常:

svn status | grep -v "^.[ \t]*\..*" | grep "^?[ \t]*..*" | awk '{print $2}' | sed 's/\\/\//g' | sed 's/\(.*\)\r/"\1"/g' | xargs svn add --parents
svn commit
  1. 状态
  2. 删除.svn
  3. 找到?在行开始确定它是否是未版本化的 (修改为 | grep "^?[ \t]*.*cpp" | 只会添加 cpp)
  4. 删除? (上述线程之一提到了 awk 的问题,您可以尝试 使用 tr 或 sed 代替)
  5. 将 splash 替换为 linux splash(可选,需要 cygwin)
  6. 用引号括起来
  7. 调用 xargs(如果您尝试过滤 cpp 或某些文件模式,您应该添加 --parent 以确保也添加中级子文件夹)

【讨论】:

    【解决方案5】:

    这将尝试添加所有文件 - 但实际上只添加尚未在 SVN 中的文件:

    svn add --force ./* 
    

    【讨论】:

      【解决方案6】:

      默认情况下,svn add 命令是递归的。只需将它指向项目的顶级目录,它就会添加任何不存在的文件。

      您可能希望包含 --force 选项,但请记住,这也会添加由于 svn:ignore 而被排除在外的文件(如果您不使用 svn:ignore,那么您将没有任何问题)。

      【讨论】:

        【解决方案7】:

        我没有使用过 SVN。但以下应该有效。

        svn add foo/bar.file bar/foo.file
        

        这应该在foo 目录中添加文件bar.filefoo.file 存在于bar 目录中。

        并且svn add foo 应该将foo 中的所有文件添加到服务器。 “递归”标志是默认设置的。

        并且要在目录中添加除少数文件之外的所有文件(例如以关键字 tmptest 等开头/结尾的文件),我认为没有更清洁/更简单的方法可以做到它,最好编写一个执行此操作的 shell 脚本。

        【讨论】:

        • 你为什么要尝试贡献一些你没有使用过的东西,或者不能确定它是否有效?
        • 我必须同意上述评论。谷歌被“我以前从未使用过 X 但......”蒙上了一层阴影。它必须停止。
        【解决方案8】:

        如果文件包含空格,上述awk '{print $2}' 的解决方案将无法正常工作。在这种情况下,这很好用:

        svn st | grep "^?" | sed 's/^?[ \t]*//g' | sed 's/^/"/g' | sed 's/$/"/g' | xargs svn add
        

        在哪里

        sed 's/^?[ \t]*//g'
        

        去掉开头的问号和空字符

        sed 's/^/"/g' | sed 's/$/"/g'
        

        用引号将文件名括起来。

        【讨论】:

          【解决方案9】:

          使用Perlone-liner 添加所有带有“svn st”问号的文件的方法是:

          svn st | perl -ne 'print "$1\n" if /^\?\s+(.*)/' | xargs svn add
          

          这也适用于文件名中的空格字符。

          【讨论】:

            【解决方案10】:

            上述命令的这个版本处理了提交文件或它们的路径包含空格的情况。但是,如果路径包含单引号,此命令仍然会失败。

            svn st |grep ^?| cut -c9-| awk '{print "\x27"$0"\x27"}' | xargs svn add
            

            我用 cut -c9- 去掉了前导空格,并假设 svn st 命令将在所有机器上的第 9 个字符处开始文件名。如果不确定,请先测试这部分命令。

            【讨论】:

              【解决方案11】:

              此 shell 脚本递归检查项目中的 (svn status) 目录,删除丢失的文件将新文件添加到存储库。它是某种“将项目的当前快照存储到存储库中”。

              if [ $# != 1 ]
              then
                  echo  "usage: doSVNsnapshot.sh DIR"
                  exit 0
              fi
              
              ROOT=$1
              
              for i in `find ${ROOT} -type d \! -path "*.svn*" `
              do
              
                  echo
                  echo "--------------------------"
                  ( cd $i ; 
                  echo $i
                  echo "--------------------------"
              
              
                  svn status | awk '  
                          /^[!]/ { system("svn rm " $2) }
                          /^[?]/ { system("svn add " $2) }
                      '
                  )
                  echo
              
              done
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2012-10-05
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2014-06-10
                • 2011-08-19
                • 1970-01-01
                • 2015-10-20
                相关资源
                最近更新 更多