SVN DIFF命令是否有元数据排除过滤器?

28
我使用SVN作为源代码控制系统,想知道如何比较目录并忽略任何元数据差异。有没有办法告诉svn diff只比较实际内容并忽略任何元数据?
我指的是像SVN属性等不影响文件内容的元数据。假设文件X在分支B中与主干T相比具有额外的属性。不幸的是,即使文件X的实际内容相同,在'svn diff T B'中也会显示它。
我需要类似这样的东西:
svn diff https://example.org/tags/v1 https://example.org/tags/v2 -x -ignore-metadata --summarize

更新:我通过直接在文件系统上进行diff而不是使用SVN工具来部分解决了这个问题。请参见下面的我的回答...


元数据是什么意思? - codelogic
"SVN 属性" 是更好的词来描述它。我修正了我的帖子以澄清这一点。 - driAn
10个回答

25

您可以通过使用“filterdiff --clean”将svn diff输出传递以删除任何多余的行,包括属性更改。


按照广告所述的工作 - 很棒!对于Debian / Ubuntu用户的提示:如果您的系统上没有filterdiff,可以通过apt-get install patchutils安装它。 - ax.
1
较新版本的svn(已在1.9.3上进行测试)提供了内置方法来实现此功能:https://dev59.com/c3RC5IYBdhLWcg3wG9bp#50515644或https://dev59.com/c3RC5IYBdhLWcg3wG9bp#18984711。 - Elliott Beach

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

即,

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

使用grep可能会更容易一些。如果您想要完整的差异,可以采用两阶段过程 - 首先使用summarize查找内容发生更改的文件,然后再进行diff比较。


7

在浏览svn帮助文档时发现了这个。

svn diff --patch-compatible

这与运行相同

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

6

来自JosephWatkins的好建议。

以下是grep-junior-users的命令:

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

grep 命令查找行中第二个字符是否为空格。

2
抱歉。必须隐藏以空格开头的所有行,因为这些行仅包含文件属性更改。命令为:svn diff A B --summarize | grep -v '^ ' - Michael Augustin
1
这种情况无法处理文件内容和属性都被更改,或者发生了其他事情(如锁定)并且文件被修改的情况。 - trysis

3

使用svn内置工具似乎无法完成此操作。我的解决方法是:导出两个目录,然后在文件系统上直接使用您喜欢的diff工具进行比较。这似乎是唯一可行的方法 :/


3
使用 svn diff --ignore-properties 命令。这是 Subversion 的内置方法,用于仅对内容进行差异比较。它会忽略项目属性的任何更改。

这并没有提供问题的答案。如果要批评或请求作者澄清,请在他们的帖子下留言。-【来自审查】 - Ravi Y
1
难道不是吗?作者的问题是如何在进行差异比较时让svn diff忽略所有子版本属性。这正是svn --ignore-properties所做的。也许我应该更好地表达它作为一个答案。我将来会尝试这样做。 - seanahern
1
@ryadavilli 为什么stackoverflow的审核人员如此迟钝? - Elliott Beach

2

这里有一个单一的命令可以完成所有操作。假设你想要在当前目录下查找在版本54833和57215之间的所有文件(非属性)差异。这个命令可以实现:

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

注意:它只会比较修改过的文件,不包括新增或已删除的文件。

1

我写了一个脚本来完成这个任务,因为我在网上找不到合适的。

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

只需将svn diff的输出导入脚本中即可,在设置脚本后进行操作。我将过滤器放在脚本中而不是参数中,因为我总是运行相同的过滤器。

我以GPLv2的形式发布了它。

clean_svn_diff.bash


-1

我不确定,但一个简单的“svn diff | grep -iv“要忽略的内容””可能是一个解决方法。


1
整个差异只是一大段文本,我必须手动解析它以过滤掉所有类似于“svn属性添加”的更改。不幸的是,我无法使用grep轻松完成这项任务。 - driAn

-6

您可以在希望svn diff忽略的文件和目录上设置svn:ignore属性。


1
我不想忽略特定的目录或文件,而是要忽略相同文件的不同属性(也称元数据)。假设文件X在分支B中与主干T相比具有额外的属性。即使实际内容相同,在svn diff中也会显示出来。 - driAn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接