使用一个Linux命令将所有未版本化的文件添加到Subversion

55

有时我会在项目中包含许多不同目录中的文件。现在,我需要一个一个地将所有文件添加到我的项目中,然后再提交。是否有任何Linux终端命令可以将所有未纳入版本控制的文件添加到Subversion中?

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

(Note: I have translated the text into Chinese as requested.)

可能是重复的问题:如何在Windows控制台中递归使用"svn add"? - Saul
11个回答

83
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处停止了。 - badri
然后我需要执行 svn add xyz/lib/* 命令来添加共享对象。它似乎可以很好地处理二进制可执行文件,但不支持共享对象。因此,我有 xyz/bin/bin1,其中 bin1 是一个二进制可执行文件。这个命令没有问题添加 bin1,但对于 so 文件却无法执行相同的操作。 - badri

29

在仍然排除被忽略的文件的情况下,添加任何带有问号标记的文件:

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

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


你好,詹姆斯。很抱歉我给你的回答点了踩,这是我的失误。请编辑一下你的回答,这样我就可以撤销这个踩(以及这条评论)。 - Guillaume
我不确定为什么,但我认为您的正则表达式对包含空格的文件名不敏感... - genuinefafa
svn status | grep -v "^.[ \t].." | grep "^?" | awk '{print $2}' | xargs svn add && svn commit -m "test" - Sky

23

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

svn add --force ./* 

13

这个命令将会把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命令搜索未版本化的文件:

[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>

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

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

第五步: 最后,将这些文件路径作为标准输入传递给 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

解释得非常好,赞! - Purush Pawar

10

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

你可能想要加入 --force 选项,但请记住,这也会添加由于 svn:ignore 而被排除的文件(如果您不使用 svn:ignore,则不会有任何问题)。


2

你们大家都没有完全正确。我花了整整一晚上的时间来修复它,现在它在我的Jenkins上正常运行:

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. 将斜杠替换为 Linux 斜杠(可选,Cygwin 需要)
  6. 用引号括起每一行
  7. 调用 xargs(您应该添加 --parent 以确保中间级子文件夹也被添加,如果您尝试过滤 cpp 或某些文件模式)

1
上述解决方案使用awk '{print $2}',但如果文件中包含空格,则不起作用。这种情况下,可以使用以下方法:
svn st | grep "^?" | sed 's/^?[ \t]*//g' | sed 's/^/"/g' | sed 's/$/"/g' | xargs svn add

where

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

删除开头的问号和空字符。
sed 's/^/"/g' | sed 's/$/"/g'

用引号括起文件名。


1

使用Perl one-liner的方法,将"svn st"显示为问号的所有文件添加到代码库中,如下所示:

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

这也适用于文件名中包含空格的情况。

0
这个 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

0

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

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接