2011-05-13 47 views
14

我们有一个存储库有几个文件(没有文件夹)。每次构建时,我们必须从另一个源(db)下载相同的文件夹,然后提交SVN更改 - 更新现有的,删除不存在并添加新文件。SVN:hg的addremove模拟

所以想法是有数据库的脚本“复制”在SVN每个版本(这就是为什么的MSBuild使用)

问题是,我不知道addremove的模拟 - 它会自动同步两个文件夹。

有没有人知道如何addremove可以模拟?

+1

这里的一个交包括两个壳别名(一个叫做add_all,另一个叫做rm_all)。这基本上可以让你运行'add_all && rm_all'来完成'hg addremove'所做的事情,但是可以实现颠覆。 http://www.plexusweb.com/staff/travis/blog/post/267/Batch-addremove-files-to-Subversion – 2011-05-13 13:24:58

+0

我不能相信这是不可能的与svn,但我不明白如何。如果没有更好的选择,你可能想考虑使用hgsubversion来维护一个本地的hg repo,使用'hg addremove',然后将这些改变推回到svn。 – 2011-05-13 14:08:49

回答

0

为了达到这个目的,我一直使用svn附带的svn_load_dirs.pl脚本。

9

我个人有一点bash脚本来做到这一点(在Linux上是):

svn status | grep "^\?" | gawk '{print $2}' | xargs -r svn add 
svn status | grep "^\!" | gawk '{print $2}' | xargs -r svn remove 

编辑:感谢cesar,这里有一个简单的版本:

svn status | gawk '/^\?.*/ {print $2}' | xargs -r svn add 
svn status | gawk '/^\!.*/ {print $2}' | xargs -r svn remove 
+1

为什么不跳过grep,只需要: 'svn status | gawk'/^\?.*/ {print $ 2}'| xargs -r svn add' – cesar 2012-01-16 04:38:35

+2

@anonymous很好的问题,可能是因为我已经通过grep管道来查看实际输出,然后尝试使用它。当然,实际上并未真正阅读gawk手册页,因此不了解该语法。谢谢。 – 2012-01-17 02:36:43

+0

包含空格的文件名怎么样?我不知道足够的gawk语法来将记录分隔符更改为\ 0 ... – moi 2015-11-26 10:22:37

0

(@Eric的改进-Karl的答案)

作品为:

  • 与 '空间' 路径字符
  • 与路径 '@' 字符
  • 与 '\' 字符路径(MSYS壳)

svn status | perl -ne 'print "$1\0" if /^\?\s+([^\r\n]+)/' | xargs -0 -r -I FILE svn add '[email protected]' 
svn status | perl -ne 'print "$1\0" if /^\!\s+([^\r\n]+)/' | xargs -0 -r -I FILE svn remove '[email protected]'