使用一个Linux命令将所有未版本控制的文件添加到Subversion
有时候,我在项目的不同目录中包含了很多文件。 现在我在提交之前将所有文件逐个添加到我的项目中。 有没有可以将所有未版本控制的文件添加到Subversion的Linuxterminal命令?
如果我想添加除一个或两个文件以外的所有文件?
svn add --force <directory> 添加已经recursion。 你只需要强制它遍历版本化的子目录。
添加任何带有问号标记的文件,但仍排除忽略的文件:
 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 
  第二步:用grep命令grep un-versioned文件: 
 [user@xxx rails]$svn st | grep ? ? app/controllers/application.rb ? config/database.yml 
  第3步:然后删除挤压之间的空间? 和使用tr命令的文件path: 
 [user@xxx rails]$svn st | grep ? | tr -s ' ' ? app/controllers/application.rb ? config/database.yml </pre> 
第四步:然后用cut命令从输出中select第二列:
 [user@xxx rails]$svn st | grep ? | tr -s ' ' | cut -d ' ' -f 2 app/controllers/application.rb config/database.yml 
  第5步:最后,将这些文件path作为标准input传递给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命令是recursion的。 只要把它指向你的项目的顶层目录,它应该添加任何不在那里的文件。 
 你可能想包括--force选项,但是请记住,这也会添加由于svn:ignore而被排除的文件(如果你不使用svn:ignore,那么你将不会有任何问题) 。 
 上面提到的解决方法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' 
用引号括起文件名。
使用Perl 单行程序添加“svn st”问号所示的所有文件的方法是:
 svn st | perl -ne 'print "$1\n" if /^\?\s+(.*)/' | xargs svn add 
这应该也适用于文件名中的空格字符。
没有人是完全正确的我花了整整一个晚上来解决它,它在我的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 
- 状态
- 删除.svn
- 找 ? 在开始的行确定它是否未版本化(修改为| grep“^?[\ t] *。* cpp”|将只添加cpp)
- 去掉 ? (以上线程之一是memk的问题,你可以尝试使用tr或者sed来代替)
- replace飞溅到Linux飞溅(可选,cygwin需要)
- 用报价括住行
- 调用xargs(你应该添加–parent来确保中级别的子文件夹也被添加,如果你尝试过滤cpp或某些文件模式)
上述命令的这个版本处理了提交的文件或其path包含空格的情况。 但是,如果path包含单引号,该命令仍然会失败。
 svn st |grep ^?| cut -c9-| awk '{print "\x27"$0"\x27"}' | xargs svn add 
我去切割-c9-摆脱领先的空间,并假设svn st命令将在所有机器上的第9个字符开始文件名。 如果您不确定,请先testing这部分命令。
 这个shell脚本recursion地检查项目中的( 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。 但以下应该工作。
 svn add foo/bar.file bar/foo.file 
 这应该在foo目录中添加文件bar.file ,并在bar目录中存在foo.file 。 
 而且svn add foo应该svn add foo所有文件加到服务器上。  “recursion”标志是默认设置的。 
 除了less数几个文件(比如以关键字tmp , test等开头/结尾的文件)之外,还要添加所有的文件,我认为没有更简单的方法来完成它,而且最好编写一个shell脚本,这样做。