我正在尝试从git存储库中提取(源代码行,作者标签)对。最简单的方法是使用git blame。问题是git blame将最后一个提交者作为作者,无论提交者是缩进代码还是真正更改代码。你知道更好的方法吗?
或者在尝试解决问题之前,我应首先检查多个源线与多个作者相关联。如果百分比很小,则无需担心。但我发现即使算数很难。对于具有单个父项的提交,我们如何知道提交更改了一行而不是删除了一行并添加了一行内容?对于具有两个父项的提交(如合并),我应该如何组合两个分支的差异结果?
谢谢
答案 0 :(得分:3)
这是对Git如何运作的基本误解。 Git不提交补丁或差异;虽然packfiles肯定会做某种划分,但它会提交树木和斑点。大多数提交历史记录在运行时是计算,具有一些差异性。
换句话说,如果你的diff工具可以做你想要的,那么Git也可以。
git-blame命令不能做你想要的,因为man page说(强调我的):
使用最后修改该行的修订版中的信息,在给定文件中注释每一行。
换句话说,它严格按行式划分。
你可以使用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为您装饰它。