【问题标题】:How to preserve git author line-by-line when using a code formatter?使用代码格式化程序时如何逐行保留 git 作者?
【发布时间】:2019-07-04 22:38:12
【问题描述】:

我们厌倦了掉毛。所以我们想在我们的项目中使用black。不幸的是,它几乎改变了我们项目中的每一行,这将使我们失去大部分的作者信息。我们在 pycharm 中使用 annotategit blame 很多来确定在查看特定代码段时与谁交谈。在一次提交中更改大量文件时如何保留这些信息?

编辑:由于这是this question 的复制品,我想重点关注“尽可能好”的方法。

让我们假设 lint 提交是由人工(但已知)作者创建的,因此用作标志。那么是否可以创建一个类似git blame 的输出,显示所有作者因为这个关键的 lint 提交以及任何 previous 在该提交中更改的行的作者?

我意识到这不适用于拆分/合并的线路,但它至少提供了一种更快的方法来限制潜在人员与 1、2、3 人交谈的范围。

【问题讨论】:

  • 它不能,在 git 中没有什么可以帮助你。最后一个运行重新格式化程序的人将获得所有已修改行的“所有权”。然而,黑色会改变一切吗,一直
  • 我认为答案很可能是“它不能在所有情况下”,考虑一下黑色何时折叠不同作者的两行。 git log -G ... 可能是开始使用的好工具
  • 不,但当然,一个拥有大约 100k+ 行代码的项目现在将由一位作者主导,即使该作者是像 lint bot 这样的人为作者,以表明实际上还有其他人“背后”那条线。

标签: git lint git-blame python-black


【解决方案1】:

来自https://git-scm.com/docs/git-blame#Documentation/git-blame.txt---ignore-revltrevgt

--忽略修订

在分配责任时忽略修订所做的更改,就好像更改从未发生过一样。被忽略的提交更改或添加的行将归咎于更改该行或附近行的先前提交。可以多次指定此选项以忽略多个修订。如果设置了 blame.markIgnoredLines 配置选项,那么被忽略的提交更改并归因于另一个提交的行将被标记为 ?在责备输出中。如果设置了 blame.markUnblamableLines 配置选项,那么那些被我们无法归因于另一个修订版的被忽略提交所触及的行将用 * 标记。

如果代码格式化全部在一次提交中完成,我认为您可以使用该标志。如果您想忽略多个提交,还有一个 --ignore-revs-file 看起来很有用。

【讨论】:

    【解决方案2】:

    我创建了一个脚本,它只更改给定作者的行。每个作者都可以将其应用于代码库并保持代码作者身份。

    
    import git
    import black
    from blib2to3.pgen2.tokenize import TokenError
    
    new_lines = list()
    author_email = "example@example.org"
    filename = "setup.py"
    for commit, lines in repo.blame('HEAD', filename):
        if author_email == commit.author.email:
            try:
                new_lines.append(
                    black.format_str(
                        "\n".join(lines), 
                        mode=black.Mode()
                    )
                )
            except:
                new_lines.extend(lines)
        else:
            new_lines.extend(lines)
    open(filename, "w").writelines(new_lines)
    

    脚本只能将代码行更改为黑色。如果作者只更改了多行语句中的一行,则不会更改它。所以在每个作者应用脚本之后,仍然需要将一些行改成黑色。不过行数会比以前少很多。

    可在此处找到更新:https://gist.github.com/JulianWgs/ba762ba729d8f17090cafd5230261ab2

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-09-27
      • 2019-06-18
      • 2019-05-29
      • 1970-01-01
      • 2019-09-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多