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

时间:2009-08-02 05:40:38

标签: svn

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

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

11 个答案:

答案 0 :(得分:78)

svn add --force <directory>

添加已经是递归的。您只需强制它遍历版本化的子目录。

答案 1 :(得分:27)

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

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

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

答案 2 :(得分:22)

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

svn add --force ./* 

答案 3 :(得分:12)

此命令会将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 :(得分:9)

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

您可能希望包含--force选项,但请记住,这也会添加因svn而忽略的文件:ignore(如果你不使用svn:ignore,那么你就赢了'有任何问题。)

答案 5 :(得分:1)

如果文件包含空格,那么上面提到的带有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'

用引号括起文件名。

答案 6 :(得分:1)

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

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

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

答案 7 :(得分:1)

你们谁都没有完全正确 我花了整整一夜来修理它并且它在我的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. 将splash替换为linux splash(可选,cygwin需要)
  6. 用引号括起来
  7. 调用xargs(如果尝试过滤cpp或某些文件模式,则应添加--parent以确保还添加中级子文件夹)

答案 8 :(得分:0)

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

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

我去剪切-c9-去除前导空格并假设svn st命令将在所有机器上的第9个字符处启动文件名。如果您不确定,请先测试这部分命令。

答案 9 :(得分: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

答案 10 :(得分:-1)

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

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

这应该在bar.file目录中添加文件foo,在foo.file目录中添加bar

svn add foo应将foo中的所有文件添加到服务器。默认情况下会设置“递归”标志。

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