有时我会在项目中包含许多不同目录中的文件。现在,我需要一个一个地将所有文件添加到我的项目中,然后再提交。是否有任何Linux终端命令可以将所有未纳入版本控制的文件添加到Subversion中?
如果我想添加除一两个文件之外的所有文件怎么办?
(Note: I have translated the text into Chinese as requested.)有时我会在项目中包含许多不同目录中的文件。现在,我需要一个一个地将所有文件添加到我的项目中,然后再提交。是否有任何Linux终端命令可以将所有未纳入版本控制的文件添加到Subversion中?
如果我想添加除一两个文件之外的所有文件怎么办?
(Note: I have translated the text into Chinese as requested.)svn add --force <directory>
add命令已经是递归的了。你只需要强制它遍历版本化的子目录。
在仍然排除被忽略的文件的情况下,添加任何带有问号标记的文件:
svn status | grep -v "^.[ \t]*\..*" | grep "^?" | awk '{print $2}' | xargs svn add
svn commit
这将尝试添加所有文件 - 但只会实际添加那些尚未在SVN中的文件:
svn add --force ./*
这个命令将会把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
默认情况下,svn add
命令是递归的。只需将其指向项目的顶级目录,它就会添加任何尚未存在的文件。
你可能想要加入 --force
选项,但请记住,这也会添加由于 svn:ignore 而被排除的文件(如果您不使用 svn:ignore,则不会有任何问题)。
你们大家都没有完全正确。我花了整整一晚上的时间来修复它,现在它在我的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
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'
用引号括起文件名。
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
这个版本的上述命令处理了提交的文件或路径中包含空格的情况。但是,如果路径包含单引号,该命令仍将失败。
svn st |grep ^?| cut -c9-| awk '{print "\x27"$0"\x27"}' | xargs svn add
我使用了 cut -c9- 命令来去掉前导空格,并假设 svn st 命令在所有机器上都从第9个字符开始。如果您不确定,请先测试命令的这一部分。