【问题标题】:Find the commit with the minimum amount of changes找到更改量最少的提交
【发布时间】:2021-05-12 08:07:24
【问题描述】:

让我有一个 Git 存储库和一个包含文件的目录。

我需要在存储库中找到提交(如果有多个这样的提交,则为最后一个“最小更改”提交)与 最小 比较的更改行数(例如,diff ) 到目录中的文件。

存储库可能很大,提交的数量也很大。

如何做到这一点?

【问题讨论】:

  • 到目前为止你尝试过什么? Git 提供了git diff 用于显示两个修订之间的变化,还有already questions about counting the number of lines changed in a diff
  • 目录是否已经在版本控制下?是外部目录吗?请提供相关资料。但我认为你必须暴力破解你的解决方案:检查所有提交,比较所有提交,排序,选择最佳匹配。对你来说什么是“改变”?最少的文件数?最少的插入?最少的删除?你想让 Git 执行重命名检测吗?

标签: git diff commit


【解决方案1】:

我认为你必须暴力破解。它会很慢。

git rev-list 列出一个范围内的所有提交。 git diff --shortstat 输出更改的行数和文件数。不幸的是,您无法将提交与外部目录进行比较,因此您要么必须提交一次目录的内容(例如,在孤立/分离的分支上),要么检查要测试的每个提交。我假设将目录作为提交可用会很多更快(YMMV)。

结合所有这些,你会得到:

git rev-list --all \
  | while read -r commit; do
    echo "$(git diff --shortstat "$commit" "$needle") -- $(git log -1 --pretty="format:%h %ci" "$commit")";
  done | sort -n | head -10

注意。这需要很长时间才能运行。如果您事先知道只有有限的一组提交是候选提交,请将一个范围传递给第一个 rev-list(例如 branch-a~10..branch-a 而不是 --all,以便仅比较 branch-a 上的最新 10 个提交)。

needle 是一个变量,其中包含您要比较的孤立提交的 id(哈希)。 sort -n 执行数字排序,head -10 仅选择 10 个最佳候选者。您可能想要输出完整列表(甚至可能在排序之前)并将其写入文件。然后,您可以排序并选择最佳候选者,而无需再次执行所有比较。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-22
    • 2020-02-01
    • 2011-06-14
    • 2011-03-26
    • 2015-05-10
    • 2012-01-20
    • 1970-01-01
    相关资源
    最近更新 更多