【问题标题】:Git commit that doesn't override original authors in git blameGit 提交不会覆盖 git blame 中的原始作者
【发布时间】:2017-06-23 19:30:35
【问题描述】:

我使用 perl 脚本修改了 php git 存储库中的所有制表符,并将它们全部更改为 4 个空格。

$ find -iname \*.php -exec perl -pi -e "s/\t/    /g" {} \

我可以使用git commit 提交此更改,但在此提交完成后,它会将我标记为git blame 内所有更改行的作者。

有没有什么方法可以提交这个不会将我标记为更改行的作者但保留原作者的巨大更改?我们不想在我们的项目中失去很多历史。

我们用 4 个空格替换制表符的目的不是为了让 git blame 中的东西看起来不同,而是为了遵循正确的 PEAR 编码标准。例如。没有制表符,使用 4 个空格进行缩进。

【问题讨论】:

标签: git git-commit git-blame


【解决方案1】:

感谢git: change styling (whitespace) without changing ownership/blame? 上的 wnoise,我想出了这个在 git 历史上运行任意过滤器,所以使用它你可以重写历史,使它看起来像冒犯空白或其他问题从未提交,留下原作者机智但您的代码已清理:git filter-branch --tree-filter 'git diff-tree --name-only --diff-filter=AM -r --no-commit-id $GIT_COMMIT | php cleanup.php' HEAD

【讨论】:

  • 美丽的 git filter-branch --tree-filter 'git diff-tree --name-only --diff-filter=AM -r --no-commit-id $GIT_COMMIT | find -iname *.php -exec perl -pi -e "s/\t/ /g" {} \;'头
  • @nookni:这是否意味着您最终使用了这个答案?那么你应该检查这个作为接受的答案
  • 在 git commit 中有没有办法指定“对于 diff 中的每一行,保留以前的作者”?例如修复来自样式 linter 的所有建议,然后提交清理后的文件?
  • 我认为从我的角度来看需要更多阅读。我不完全了解如何使用它。所以我提交删除所有双引号并用单引号替换它们然后运行此代码?还是我运行此代码,然后更改它们:D
  • @JamieHutber 在我的例子中,脚本 cleanup.php 用单引号替换双引号
【解决方案2】:

commit 命令的责任不是决定如何处理空格,而是 blame 命令的责任,因为它是 blame em> 分析版本之间的差异以获得每一行的作者。所以在 blame 中寻找一个忽略空格的选项:

选项 -w 定义为: “在比较父版本和子版本以查找行的来源时,请忽略空格。” http://kernel.org/pub/software/scm/git/docs/git-blame.html

【讨论】:

  • 我们正在努力遵循良好的 PEAR 编码标准,该标准坚持使用 4 个空格来代替制表符。这也使得跨 OS/IDE 实现的统一变得更好......
  • 我想你误解了我的回答。我的意思是你应该告诉责备忽略空格中的更改(因此间接地提交),而不是尝试显式标记提交以便它不会出现在 blame 中。
  • 是的,遗憾的是,您的答案仅适用于实际使用 -w 标志的情况。在 IDE 和基于 Web 的工具(Github 等)中并非如此。
  • @Timmmm 那是这些工具的失败。在他们的 GitHub 问题中提出问题,要求他们(可选?)忽略空格更改。
猜你喜欢
  • 2012-05-09
  • 2012-03-15
  • 1970-01-01
  • 2018-12-26
  • 2015-08-22
  • 2013-03-05
  • 2021-10-25
  • 1970-01-01
相关资源
最近更新 更多