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

有时候,我在项目的不同目录中包含了很多文件。 现在我在提交之前将所有文件逐个添加到我的项目中。 有没有可以将所有未版本控制的文件添加到Subversion的Linuxterminal命令?

如果我想添加除一个或两个文件以外的所有文件?

svn add --force <directory> 

添加已经recursion。 你只需要强制它遍历版本化的子目录。

添加任何带有问号标记的文件,但仍排除忽略的文件:

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

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

这将尝试添加所有文件 – 但实际上只添加那些不在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 
  1. 状态
  2. 删除.svn
  3. 找 ? 在开始的行确定它是否未版本化(修改为| grep“^?[\ t] *。* cpp”|将只添加cpp)
  4. 去掉 ? (以上线程之一是memk的问题,你可以尝试使用tr或者sed来代替)
  5. replace飞溅到Linux飞溅(可选,cygwin需要)
  6. 用报价括住行
  7. 调用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数几个文件(比如以关键字tmptest等开头/结尾的文件)之外,还要添加所有的文件,我认为没有更简单的方法来完成它,而且最好编写一个shell脚本,这样做。