使用一个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脚本,这样做。