有时我在项目的不同目录中包含许多文件。现在我在提交之前将所有文件逐个添加到我的项目中。是否有任何Linux终端命令可以将所有未版本控制的文件添加到Subversion?
如果我想添加除一个或两个文件之外的所有文件怎么办?
答案 0 :(得分:78)
svn add --force <directory>
添加已经是递归的。您只需强制它遍历版本化的子目录。
答案 1 :(得分:27)
添加任何旁边带有问号的文件,同时仍然排除被忽略的文件:
svn status | grep -v "^.[ \t]*\..*" | grep "^?" | awk '{print $2}' | xargs svn add
svn commit
答案 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
答案 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
中的所有文件添加到服务器。默认情况下会设置“递归”标志。
要添加除少数目录之外的所有文件(例如以关键字tmp
,test
等开头/结尾的文件),我认为没有更清洁/更简单的方法,并且更好地编写一个执行此操作的shell脚本。