2009-04-20 239 views
128

当我合并我的存储库中的东西时,Subversion想要将大量的svn:mergeinfo属性添加到与我想要合并的东西完全无关的文件中。删除不必要的svn:mergeinfo属性

有关此问题的问题,之前在这里堆栈溢出一直在问:

从我从上面看起来提到的主题理解我的仓库中有很多文件在它们不应该的时候都有明确的svn:mergeinfo属性。建议是减少金额,只将这些属性放在相关文件/文件夹中。

所以,现在我的问题:我怎样才能轻松地删除那些不需要的属性?我正在使用TortoiseSVN,但我不愿意手动检查/修复数百个文件。有没有更简单的方法来删除那些不必要的svn:mergeinfo属性?

P.S.我是而不是正在寻找C++ SVN API代码。

回答

12

正如this thread提到:

  • 大部分空合并信息(“空白”)可以通过工作拷贝工作拷贝拷贝/移动在源项目没有明确的合并信息而引起的。使用propdel可以成为解决方案,除非您使用的是1.6 SVN:自1.5.5以来,这些WC到WC的副本不再在目标上创建空的mergeinfo
  • 以前的svn move(rename)重构操作也可以传播mergeinfo,而不是在根目录下留下他们
  • 有一个潜在的内存问题,通过case 3393跟踪将被固定在即将到来的1.6.2版本和1.5
2

后移植如果你确定你想要批量移除mergeinfo属性,可以使用下面的BASH脚本。

FILES=`svn status |grep "^ M  " |sed s/" M  "// |tr '\n', ' '` 
svn revert $FILES 

它得到的文件改变列表,过滤它只是合并信息只改变,去掉一切,但实际的文件路径,在一个每行路径转换成空间分隔的列表,并呼吁恢复上该清单。

+2

Thanx,但正如你可能从我提到的TortoiseSVN知道的我是一个Windows用户,并且不使用Bash shell :-) – LeonZandman 2009-09-15 11:03:28

+0

在DOS中同样的事情应该是可能的,尽管可能不是简单的。 – 2009-09-15 17:04:44

+1

这不仅仅是在当前工作目录下还原具有修改后的mergeinfo的文件吗?如果是这样,它不解决问题:现有的显式mergeinfo。为此,你需要propdel。 – 2009-12-22 02:19:21

13

以下是删除所有子树svn:mergeinfo属性的方法。运行它,你的版本库的根内侧:

svn propget svn:mergeinfo --depth=infinity 
    | grep -v "^/" 
    | grep -v "^\." 
    | cut -d- -f1 
    | xargs svn propdel svn:mergeinfo 

全部为便于复制/粘贴一行:

svn propget svn:mergeinfo --depth=infinity | grep -v "^/" | grep -v "^\." | cut -d- -f1 | xargs svn propdel svn:mergeinfo 

要预览该文件在运行之前这会影响,改变过去“propdel “完全”预先“或删除最后一个xargs管道。

+2

在文件中使用连字符: svn propget -R svn:mergeinfo | grep -v“^ /”| grep -v“^ \”。 |切“-d”-f1 | xargs svn propdel svn:mergeinfo – Squirrel 2010-04-29 13:56:40

2

我知道这是一段时间,但我遇到了类似的问题。我使用的是TortoiseSVN 1.6.7。事情发生的恰恰是该财产是我工作副本的根源。当我查看根上的属性并单击svn:mergeinfo上的Remove时,它问我是否想递归移除它。这摆脱了我所有的svn:mergeinfo cockups。

131

这是删除所有子树svn:mergeinfo属性但不在根文件夹(这是分支工作正常工作所需的)的另一种方法。

从项目的根做:

svn propdel svn:mergeinfo -R 
svn revert . 
svn ci -m "Removed mergeinfo" 
1

要做到在目录结构的变化,这将是(非DOS '发现' 只):

find . -path "*/.svn" -prune -or -exec svn propdel svn:mergeinfo '{}' \; 

运行1.6 .12客户端连接到1.5服务器,我有类似的问题;有项目中需要自己的svn:mergeinfo,但有121个这样的条目(包括下面的./var 5个目录“svn:ignore *”)的子目录似乎有些不合适。因此,有一个能够删除明显多余的合并信息并告诉其他差异的(例如Python)脚本将是很好的...

4

由于我对盲目的svn:merge-info属性删除没有信心,我已经实施一个工具来分析工作副本上的当前情况并从非根合并信息属性中尽可能多地移除合并修订。经过额外的人工检查和控制后,工作副本上的更改可以提交。

这就是:svn-clean-mergeinfo

不要犹豫报告有关其使用情况,以得到它改进的任何问题。

颠覆1.10介绍了专门针对该任务的新工具:svn-mergeinfo-normalizer

2

而不是盲目地删除合并信息的属性,它也可以完成“丢失”的合并。

从根文件夹复制mergeinfo属性,然后对子文件夹执行合适的相应路径和完全相同的修订列表。 (您可以但不需要仅列出此列表与子文件夹中已存在的列表之间的差异。)

通常,此合并应最终只更改mergeinfo属性,而不是任何实际文件。 (如果它确实最终更改了文件,那么之前的一个合并只能是部分合并,这可能会导致您遇到问题。)

这样做应该最终会为您删除mergeinfo属性,一次你已经让他们两个完全匹配。您可能还需要做相反的事情:合并到只存在于子文件夹中的任何合并修订(再次,您可以粘贴完整列表并让SVN为您找出差异)。