我正在尝试从 git 存储库中提取(源代码行,作者标签)对。最简单的方法是使用 git blame。问题是 git blame 将最后一个提交者作为作者,无论提交者只是缩进代码还是真正更改代码。你知道更好的方法吗?
或者也许在尝试解决问题之前,我应该首先检查有多少源代码行与多个作者相关联。如果百分比很小,则无需担心。但我发现即使是数数也很困难。对于具有单亲的提交,我们如何知道提交更改了一行而不是删除了一行并添加了一行?对于有两个父母的提交(如合并),我应该如何结合两个分支的差异结果?
谢谢
我正在尝试从 git 存储库中提取(源代码行,作者标签)对。最简单的方法是使用 git blame。问题是 git blame 将最后一个提交者作为作者,无论提交者只是缩进代码还是真正更改代码。你知道更好的方法吗?
或者也许在尝试解决问题之前,我应该首先检查有多少源代码行与多个作者相关联。如果百分比很小,则无需担心。但我发现即使是数数也很困难。对于具有单亲的提交,我们如何知道提交更改了一行而不是删除了一行并添加了一行?对于有两个父母的提交(如合并),我应该如何结合两个分支的差异结果?
谢谢
这是对 Git 工作原理的根本误解。Git 不提交补丁或差异;它提交树和 blob,尽管包文件肯定会进行某种分类。大多数提交历史是在运行时计算的,带有一些差异。
换句话说,如果你的差异工具可以做你想做的事,那么 Git 也可以。
git-blame 命令不会做你想做的事,因为手册页说(强调我的):
使用上次修改该行的修订版中的信息注释给定文件中的每一行。
换句话说,它是严格面向行的。
你可以使用 git-log 接近你想要的。例如:
# Show diffs with indifference to whitespace changes (e.g. indenting).
git log --patch --ignore-space-change
# Just ignore whitespace altogether.
git log --patch --ignore-all-space
# Show deletions with [- -] and additions with {+ +}.
git log --patch --word-diff=plain
# Custom diff format where ~ denotes newlines.
git log --patch --word-diff=porcelain
瓷器格式旨在用于文本处理,但从视觉角度来看它非常不直观。但是,man 1 git-diff
为了您的编程乐趣,它已被详细记录。
缺点是您必须从与每个提交关联的 GIT_AUTHOR_NAME 或 GIT_COMMITTER_NAME 获取作者信息,而不是让 Git 为您装饰它。