不改变 `git blame` 报告的信息,是否可能对代码进行更改?

7
假设我有一个包含多个用户代码的git仓库,但其中一些人不遵循缩进规则,使用空格而不是制表符。更改这一点很容易,但是通过清理他们的代码, git blame 变得不那么有用,因为我会被指责为别人的代码。
我知道可以使用相应的标志指定提交作者和日期,但是这个解决方案对我来说并不理想,因为我需要迭代用户并依次更改每个用户的缩进。我还必须找到更改行的原始提交日期,以便使用 --date 标志。
我也知道 git blame -w 会忽略这种空格更改,但我想让更改变得透明。每次使用 blame 时都要使用 -w 让我感到繁琐。(顺便说一下,我怀疑其他人在从 blame 中提取信息时是否记得使用该标志)。如果更改与空格无关(例如,将单引号替换为双引号),此方法也会失效。
在git中更改跟踪文件时,是否可能不被视为更改行的作者,并且最好不更改原始提交的日期?

2
你可以使用 git config user.name (和 user.email)。不过,我得断言这是不道德的解决方案,因为你在撰写更改时实际上是在说谎。如果风格指南很重要,请不要接受违反其规定的提交。如果你正在使用集中式源代码控制,请安装一个钩子来拒绝这些提交当有人尝试推送时。 - Stephen Newell
3
@bleistift2 - 你的问题本质上涉及到重写历史。避免这种情况的唯一方法就是不去做你所要求的事情。 - Oliver Charlesworth
5
解决问题的根源如何?与团队其他成员商定一个空格样式,并在今后修改的所有代码中坚持使用它。您可以使用Git hooks来帮助强制执行这种样式(在提交或推送时)。 - jub0bs
@bleistift2 无论你如何查找每个“有问题的”提交,只要你想保留责任,就需要这样做。没有办法创建一个“透明”的提交,这意味着你要么重写历史,要么依次模拟每个用户 - 解决他们的问题。对于两种解决方案,你都需要知道哪些提交存在问题,以便可以编辑或提取作者信息。 - fredrik
1
我会运行一个脚本,替换所有不规则的制表符,并在单独的提交中更新代码。你的名字作为代码作者并不重要,这个修改是可以被追踪的。重要的是不要将其他代码更改与此修复混合在同一次提交中。 - Jardel Lucca
显示剩余8条评论
2个回答

1
我还没有测试过这个核心git功能,但无论如何,在这个答案的后半部分中,我提到了一种非常不同的策略(GitLens),我已经测试过它...
Git 2.23版本推出了一个功能,可以满足您的需求。在进行git blame时,您可以指定一个文件,其中包含要忽略的提交列表。
步骤:
  1. 只提交进行代码格式化的一个或多个常规提交。
    • 顺便提一下:我建议使用 Prettier 生成这样的提交。(这是一个工具,它可以让你运行类似 npx prettier -w --single-quote **/* 的命令来格式化你的文件。警告:这个特定的命令可能会改变/改进你在该文件夹中的大多数文件,并且它将遵循该文件夹中拥有smlinks(如果你使用smlinks)的任何symlink来更改那些其他的关联文件夹中的文件。(你必须安装Node才能使用 npx。))
  2. 按照https://akrabat.com/ignoring-revisions-with-git-blame/上的说明,在执行git blame时忽略那些提交。

可选的奖励步骤:阅读某人在那篇文章上发表的评论,该评论说明如何获取GitLens扩展程序,并让其注意列出要忽略的提交的文件。再也不要在命令行上使用git blame,只需使用GitLens的git历史工具。

  • 关于GitLens的额外提示:
    • 确保在.vscode/settings.json文件中设置/行加入"gitlens.blame.ignoreWhitespace": true,(该文件是适用于所有参与项目工作的人的vscode设置)。
    • GitLens提供了许多很好的查看git blame的方法,但当我搜索git历史记录时,大多数情况下,只显示一行的最后一个编辑者的浅层git blame对我的需求来说不够强大。因此,当我想要查看特定行的历史记录(跨越几个提交),我使用左侧面板。请务必按下此处显示的小按钮(鼠标悬停时不会显示)vscode screenshot of button to toggle looking at git blame history of an entire file or for a single line,从显示整个文件的git历史记录切换到仅显示光标所在行的git历史记录,并可靠地跟踪文件重命名。 这个方法非常有效,我甚至不需要做https://akrabat.com/ignoring-revisions-with-git-blame/中所说的事情。
    • 在执行上一个提示中提到的操作时,我还发现我需要经常使用固定历史记录按钮 pin history button screenshot。我将告诉您我遵循的魔法高效步骤。我知道我列出的步骤看起来很长,但是一旦你知道了这些步骤,只需要大约1分钟即可完成。以下是步骤:
      1. 使用安装了GitLens扩展的VS Code查看文件。(希望您已经在做这个了,因为vscode非常棒而且相对较轻。)
      2. 将光标放在要查看历史记录的行上。
      3. 确保已切��到“行历史记录”模式。(请参见第一个截图。)
      4. 切换到固定历史记录按钮
      5. 在列表中点击提交。单击几次,直到您找到最老的一个,在屏幕中央立即显示与您所关心的行相关的好/有用的差异(通常是列表中的顶部提交)。
      6. 将光标放在差异左侧的行版本上。
      7. 连续按两下固定历史记录按钮,以将其切换关闭,然后再打开。
      8. 返回步骤5,并重复此过程,直到找到引入该令人讨厌的bug的提交,以便您可以知道该提交的作者,并发送他们一封礼貌的通知,告诉他们下次特别注意什么类型的错误。

0

git filter-branch 命令族将重写历史记录,并默认保留原始时间戳和作者。


以下命令将会列出当前提交中所修改的文件:

git diff --no-renames --diff-filter=AM HEAD^

如果您有一个“重新缩进”脚本,您可以将此列表提供给该脚本:
# let's say you save this script in file /tmp/cleanup-head.sh :
git diff --no-renames --diff-filter=AM HEAD^ | xargs reindent

现在您可以将cleanup-head.sh用作“索引过滤器”的操作:

git filter-branch --index-filter '/tmp/cleanup-head.sh && git add -u' <branch1> <branch2> ...

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接