【问题标题】:Extract authorship information from git repository从 git 存储库中提取作者信息
【发布时间】:2012-06-06 21:45:09
【问题描述】:
我正在尝试从 git 存储库中提取(源代码行,作者标签)对。最简单的方法是使用 git blame。问题是 git blame 将最后一个提交者作为作者,无论提交者只是缩进代码还是真正更改代码。你知道有什么更好的方法吗?
或者也许在尝试解决问题之前,我应该首先检查有多少源代码行与多个作者相关联。如果百分比很小,则无需担心。但我发现即使是数数也很困难。对于具有单亲的提交,我们如何知道提交更改了一行而不是删除了一行并添加了一行?对于有两个父母的提交(如合并),我应该如何结合两个分支的差异结果?
谢谢
【问题讨论】:
标签:
git
repository
author
【解决方案1】:
概述
这是对 Git 工作原理的根本误解。 Git 不提交补丁或差异;它会提交树和 blob,尽管packfiles 肯定会进行某种分类。大多数提交历史记录是在运行时计算的,带有一些差异。
换句话说,如果您的差异工具可以做您想做的事,那么 Git 也可以。
混帐责备
git-blame 命令不会做你想做的事,因为手册页说(强调我的):
在给定文件中的每一行用上次修改该行的修订版的信息进行注释。
换句话说,它是严格面向行的。
git 日志
你可以通过 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 为您装饰它。