2008-12-31 60 views
22

我使用SVN作为源代码控制系统,我想知道如何比较目录,同时忽略任何元数据差异。有没有办法告诉svn diff只比较实际内容并忽略任何元数据?SVN DIFF命令是否有元数据排除过滤器?

我的意思是元数据像SVN属性等不影响文件内容。假设文件X在分支B中与trunk T相比具有附加属性。不幸的是,即使文件X的实际内容相同,它也会显示在'svn diff T B'中。

我期待这样的事情:

svn diff https://example.org/tags/v1 https://example.org/tags/v2 -x -ignore-metadata --summarize 

更新:我部分地通过直接在文件系统diff'ing而不是使用SVN工具解决了这个。看到我自己的回答如下...

+0

你是什么意思的元数据? – codelogic 2008-12-31 08:32:44

+0

“SVN属性”是一个更好的词来描述它。我修复了我的帖子,以澄清这一点.. – driAn 2008-12-31 10:39:31

+0

如果你找到一个解决方案,请发布它,我很好奇这将如何完成。也许GIT有这个功能...... – 2009-01-03 06:30:53

回答

3

似乎没有办法使用svn内置工具来完成此操作。我如何解决它: 导出两个树并使用您最喜爱的diff工具直接在文件系统上进行区分。这是完成此操作的唯一方法:/

0

我不确定,但一个简单的'svn diff | grep -iv“要忽略的东西”将是一种解决方法。

+1

整个差异只是作为一个大量的文本,我不得不手动解析它来过滤掉所有'svn属性added'-like变化。不幸的是,我不能使用grep完成任何简单的任务。 – driAn 2009-01-02 17:06:06

-6

你可以设置svn:ignore属性的文件和目录你想svn diff忽略。

+1

我不想忽略特定的目录或文件,它是关于忽略相同文件的不同属性(又称元数据)。假设文件X在分支B中与trunk T相比具有附加属性,即使实际内容相同,它也会显示在svn diff中。 – driAn 2008-12-31 09:56:55

10

如果您使用--summarize选项,则属性更改将在第二列而非第一列中指示。

即,

M URL -- indicates content change 
M URL -- property change 
MM URL -- content and property change 

这是一个有点容易的grep。我想如果你想要一个完整的比较,你可以有一个两阶段的过程 - 首先使用总结来找到内容改变的文件,然后区分它们。

5

从JosephWatkins的尼斯提示。

下面是grep的-初级用户的命令:

svn diff A B --summarize | grep '^. ' 

grep的查找就行第二个字符的空间。

1

我写了一个脚本来做到这一点,我找不到一个在线。

该脚本根据在脚本顶部输入的正则表达式数组删除数据。目前,它设置为过滤掉属性更改,但可以删除与一系列正则表达式匹配的所有更改。

在设置脚本之后,只需将svn diff的输出传送给脚本。我将过滤器放在脚本中而不是参数中,因为我总是运行相同的过滤器。

我将它作为GPLv2发布。

clean_svn_diff.bash

21

可以通过“filterdiff --clean”传递的svn diff的输出,以除去任何多余的线,包括属性更改。

2

这是一个单一的命令,可以做到这一切。假设你要查找所有(非财产)的修订54833和57215.之间在当前目录下的所有文件的比较这个命令应该这样做:

svn diff -r 54833:57215 --summarize | egrep -v '^ |^D|^A' | awk '{ print $2 }' | xargs svn diff -r 54833:57215 

注:只的diff修改的文件 - 不添加或删除文件。

1

发现这个同时通过SVN帮助文档

svn diff --patch-compatible 

这是相同的搜索为运行

svn diff --show-copies-as-adds --ignore-properties