【发布时间】:2009-08-02 05:40:38
【问题描述】:
有时我在项目的不同目录中包含许多文件。现在,我在提交之前将所有文件一一添加到我的项目中。是否有任何 Linux 终端命令可以将所有未版本化的文件添加到 Subversion?
如果我想添加除一两个文件之外的所有文件怎么办?
【问题讨论】:
标签: svn
有时我在项目的不同目录中包含许多文件。现在,我在提交之前将所有文件一一添加到我的项目中。是否有任何 Linux 终端命令可以将所有未版本化的文件添加到 Subversion?
如果我想添加除一两个文件之外的所有文件怎么办?
【问题讨论】:
标签: svn
svn add --force <directory>
Add 已经是递归的。你只需要强制它遍历版本化的子目录。
【讨论】:
添加旁边带有问号的任何文件,同时仍排除被忽略的文件:
svn status | grep -v "^.[ \t]*\..*" | grep "^?" | awk '{print $2}' | xargs svn add
svn commit
【讨论】:
此命令会将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
【讨论】:
你们没有一个是完全正确的 我花了整整一个晚上来修复它,它在我的詹金斯中运行正常:
svn status | grep -v "^.[ \t]*\..*" | grep "^?[ \t]*..*" | awk '{print $2}' | sed 's/\\/\//g' | sed 's/\(.*\)\r/"\1"/g' | xargs svn add --parents
svn commit
【讨论】:
这将尝试添加所有文件 - 但实际上只添加尚未在 SVN 中的文件:
svn add --force ./*
【讨论】:
默认情况下,svn add 命令是递归的。只需将它指向项目的顶级目录,它就会添加任何不存在的文件。
您可能希望包含 --force 选项,但请记住,这也会添加由于 svn:ignore 而被排除在外的文件(如果您不使用 svn:ignore,那么您将没有任何问题)。
【讨论】:
我没有使用过 SVN。但以下应该有效。
svn add foo/bar.file bar/foo.file
这应该在foo 目录中添加文件bar.file 和foo.file 存在于bar 目录中。
并且svn add foo 应该将foo 中的所有文件添加到服务器。 “递归”标志是默认设置的。
并且要在目录中添加除少数文件之外的所有文件(例如以关键字 tmp、test 等开头/结尾的文件),我认为没有更清洁/更简单的方法可以做到它,最好编写一个执行此操作的 shell 脚本。
【讨论】:
如果文件包含空格,上述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'
用引号将文件名括起来。
【讨论】:
上述命令的这个版本处理了提交文件或它们的路径包含空格的情况。但是,如果路径包含单引号,此命令仍然会失败。
svn st |grep ^?| cut -c9-| awk '{print "\x27"$0"\x27"}' | xargs svn add
我用 cut -c9- 去掉了前导空格,并假设 svn st 命令将在所有机器上的第 9 个字符处开始文件名。如果不确定,请先测试这部分命令。
【讨论】:
此 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
【讨论】: