【问题标题】:Extract meaningful changes with git diff使用 git diff 提取有意义的更改
【发布时间】:2017-03-21 11:25:37
【问题描述】:

我正在尝试获取大量 HTML 文档的提交之间的更改,但我很快注意到大多数更改并不重要,通常是日志记录、版本更改以防止缓存或外部脚本的结果。例如:

<a class="support-ga" target="_blank" href="#">0fb63cacd50e / 0fb63cacd50e @ 
-app-151</a>
+app-107</a>
<input type='hidden' name='csrfmiddlewaretoken' 
-value='82NB5DdySoICu1mqcl0RZVk5dMCOVEQd'
+value='a0zBgxBevaBugotGpNKI6kMPsIsBbH44'
/>

前面的示例表明,查看这些更改可能不是很有趣或有用。

我想知道是否有 git diff 命令可以忽略这种更改。另一种选择是根据相似性对差异进行排名。到目前为止,我一直在使用 git diff --word-diff=porcelain --unified=0 HEAD~1 HEAD 命令,然后处理该输出以提取更改、计算 Levenshtein 距离并删除重复项。这有帮助,但考虑到 git 已经知道应该比较哪些行并提供可配置的行数作为上下文,这不是一个很好的解决方案。

【问题讨论】:

  • 不确定您的用例是什么 - 像这样的日志和生成的代码通常不会包含在 git 存储库中。为了避免这个确切的问题,通常会忽略在构建/运行时生成的任何内容。
  • 当然。显然,大量的 HTML 文档不是 git repo 的一部分。其中大部分是通过网络抓取下载的,并且网站大量使用 javascript。顺便说一句,我看到一些 git 客户端已经提供了相似性度量,但我认为这只是为了提供信息。
  • “相似度索引”内置于 Git 中,用于重命名检测:参见 stackoverflow.com/a/21292993/1256452(特别参见 cmets:它基于行,减去空格,但分为 60-长行或二进制文件的字符片段)。
  • 有趣。那么“相似度索引”在这里不是很有用(即使可以使用),因为每一行都会有不同的哈希值。

标签: git diff


【解决方案1】:

您可以尝试编写一个差异驱动程序来忽略特定模式。
this discussion as an example

echo '*.html filter=ignore_value' >> .gitattributes
git config filter.ignore_value.clean "sed -e '/^value= .*$/d'" 

这只是初稿,因为value 属性可能不在行首:您需要调整正则表达式以检测并忽略任何您希望跳过的更改行。

OP Robert Smith 指向 (in the comments) 一个更完整的命令:

git diff --unified=0 HEAD~1 HEAD | grep -v -E -f PATTERNS.txt

【讨论】:

  • 我当然读过驱动程序。不幸的是,我认为这种方法不太可能扩展,因为我事先不知道应该忽略哪些模式。这就是我尝试使用数学上倾向于过滤不相关更改的原因,但感谢您的建议。
  • @RobertSmith 如果您想忽略的更改数量有限,则可以扩展。但是这些变化(将被跳过)不断出现......那么Git不会有太大帮助。
  • 这些更改在大多数情况下会在文档和提交中一遍又一遍地重复。但是,从上面的示例中可以看出,要猜出哪些模式需要忽略并不容易,因此对于数百个 HTML 文档的工作量是相当大的。
  • @RobertSmith 好的。说到 Git 和 git diff,我只知道那些驱动程序。
  • 我尝试了这个解决方案,但我注意到过滤器只适用于 git diff(不是 git diff HEAD~1 HEAD)并且只删除 + 修改后的文本(例如删除 +value='a0zBgxBevaBugotGpNKI6kMPsIsBbH44' 但 @ 987654329@ 仍在输出中)。这是正确的吗?
猜你喜欢
  • 1970-01-01
  • 2015-12-22
  • 1970-01-01
  • 2013-05-20
  • 2016-01-14
  • 1970-01-01
  • 1970-01-01
  • 2015-12-27
  • 2022-12-03
相关资源
最近更新 更多