【问题标题】:(How) can I filter the commit log messages?(如何)我可以过滤提交日志消息吗?
【发布时间】:2021-12-28 10:40:34
【问题描述】:

我反复使用git filter-branch ...(根据我在书中找到的说明)从 git 存储库中提取了一个新模块。 基本上我删除了许多不相关的文件(即“其他所有文件”)。 现在我已经完成了,但是git log 有许多日志消息描述了对不再存在的文件所做的更改。

所以我有一个问题: 是否可以“过滤掉”那些不影响任何剩余文件的日志消息? 此外,是否可以“修改”所有现有日志条目以删除引用不再存在的文件的文本?

第一部分将删除完整的提交消息(也可能是“现在为空”的提交),而第二部分将允许编辑无法删除的日志消息(可能类似于交互式 rebase)。

【问题讨论】:

  • git filter-branch 有一个选项 --prune-empty 可以删除不对其树进行任何更改的提交。
  • 我想你会发现 git-filter-repo 更适合 github.com/newren/… 的任务

标签: git git-rewrite-history


【解决方案1】:

这是很难做到的(虽然没有收到更好的建议):

  1. git rebase --interactive <root-commit> 开头(git 不允许使用全零的提交 ID)。在编辑器中将每个pick 替换为reword。然后,进行变基,用一些独特的标记,如DDD(表示“要删除”)标记每个不相关提交的标题(即影响不再存在的文件)。有超过 300 次提交,这是相当大的工作。

  2. 完成第一次变基后,再执行一次git rebase --interactive <root-commit>,但这次删除所有标有DDD 的行;例如在vi 中,可以使用 :g/ DDD /d。此步骤有效地从历史记录中删除不相关的提交消息。

  3. git log 仍然显示一些无用的提交消息时,您可能想要进行另一轮交互式变基,但这次使用squash 而不是skip,其中多个提交可能会合并为一个。实际上,在我对结果感到满意之前,我什至重复了这一步。

如果您在处理存储库之前分配了一个标签,而在完成后又分配了一个标签,您可以使用git diff <old-tag> <new-tag> 检查结果。 由于 rebase 废弃了许多提交,您可以考虑使用git gc(可能在git fsck 之后)来整理工作空间。

【讨论】:

    【解决方案2】:

    Git mailing list 中所述,基于python 的git filter-repo 使用--message-callback 涵盖了此用例。

    例子

    git-filter-repo --message-callback '
      if b"Signed-off-by:" not in message:
        message += b"\nSigned-off-by: Me My <self@and.eye>"
      return re.sub(b"[Ee]-?[Mm][Aa][Ii][Ll]", b"email", message)'
    

    在你的情况下:

    • 编写一个更复杂的 python 函数,以检查提交消息是否包含文本文件中设置的文件列表中的文件名。
    • 添加--prune-empty=always,以确保并删除空提交。

    【讨论】:

      猜你喜欢
      • 2020-04-13
      • 1970-01-01
      • 2021-06-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-24
      相关资源
      最近更新 更多