在Git提交日志中查找/替换

在Git提交日志中查找/替换,git,history,privacy,git-filter-branch,Git,History,Privacy,Git Filter Branch,如何重写提交历史记录以确保某些关键字永远不会出现 背景:我们有三层存储库: 本地-我们的开发环境 内部-我们团队的私人GH存储库 客户生产/终端客户。我们所有的真名、电子邮件等都不能出现在这里 我已经发现,git filter branch可以帮助重写历史以删除名称,使用类似的方法 git filter-branch -f --env-filter "GIT_AUTHOR_NAME='safeusername'; GIT_AUTHOR_EMAIL='safe@email.com'; GIT_CO

如何重写提交历史记录以确保某些关键字永远不会出现

背景:我们有三层存储库:

  • 本地-我们的开发环境
  • 内部-我们团队的私人GH存储库
  • 客户生产/终端客户。我们所有的真名、电子邮件等都不能出现在这里
  • 我已经发现,
    git filter branch
    可以帮助重写历史以删除名称,使用类似的方法

    git filter-branch -f --env-filter "GIT_AUTHOR_NAME='safeusername'; GIT_AUTHOR_EMAIL='safe@email.com'; GIT_COMMITTER_NAME='safeusername'; GIT_COMMITTER_EMAIL='safe@email.com';" HEAD
    
    这似乎很有效。当我推到最后一个遥控器时,我们的名字都不在了。然而,在一些合并中,我不希望出现任何分支名称或其他评论

    此外,我希望我们的实际电子邮件和用户名继续配置,使我们的内部项目管理系统的工作,是透明的

    如何确保关键字或名称列表不会出现在提交消息中?还有,还有其他解决这个问题的方法吗


    谢谢

    好的,这样做的一般流程是:

    • 克隆/拉入未修改的回购协议(可能每次都是新的,可能重复使用)
    • 运行过滤器分支,做魔术
    • 确认一切都是安全的
    • 发布到客户回购协议
    首先是魔法。您需要使用git筛选器分支--commit filter我的提交筛选器脚本。直接调用它,而不是使用提交树,获取必要的参数和stdin上的提交消息。因此,您需要执行以下操作:

    #!/bin/bash
    
    GIT_AUTHOR_NAME=$(sanitize "$GIT_AUTHOR_NAME")
    # ... similar for AUTHOR_EMAIL, COMMITTER_(NAME|EMAIL)
    
    sed 's/scary-string/safe-string/' |
    git commit-tree "$@"
    
    也就是说,通过适当的环境变量更改名称和电子邮件,对消息运行所需的任何筛选,并将其传递到正常运行的提交树调用
    sanitize
    是一个函数/脚本,用于对姓名/电子邮件进行一些私有->公共映射;如果您只想将它们全部更改为一个名称,那么这一点非常简单。sed命令可能有点花哨,例如读取一个转换表。这一点由你决定,取决于你需要做的消毒的复杂性

    如果您信任您的提交消息过滤,那么此时您就完成了。如果要验证,可以手动执行,也可以独立搜索“危险”字符串。例如,如果您有一个文件
    danger strings.txt
    ,您可以执行
    git log--pretty=“%an%ae%cn%ce%n%B”[branchs]| grep-f danger strings.txt
    。(log命令打印作者/提交人姓名/电子邮件,后跟提交消息。)

    然后以普通推送方式发布

    最后,为未来有不同需求的读者提供一些备选建议:

    • 进行新的提交,而不是重写提交。消息可以是快速版本控制信息(包括它所表示的内部提交的SHA1),也可以包括所引入的提交的简短日志(只是主题)。您可以通过保留发布分支并使用
      git merge--squash[--log]
      来实现这一点,或者在将内容复制到中之后,在单独的回购中提交fresh

    • 以不需要转换的形式保存回购协议。这对于OP来说似乎是不可能的,但是如果你的情况不同,就简单一点。风险越小,工作就越少


      • 好的,这样做的一般流程是:

        • 克隆/拉入未修改的回购协议(可能每次都是新的,可能重复使用)
        • 运行过滤器分支,做魔术
        • 确认一切都是安全的
        • 发布到客户回购协议
        首先是魔法。您需要使用git筛选器分支--commit filter我的提交筛选器脚本。直接调用它,而不是使用提交树,获取必要的参数和stdin上的提交消息。因此,您需要执行以下操作:

        #!/bin/bash
        
        GIT_AUTHOR_NAME=$(sanitize "$GIT_AUTHOR_NAME")
        # ... similar for AUTHOR_EMAIL, COMMITTER_(NAME|EMAIL)
        
        sed 's/scary-string/safe-string/' |
        git commit-tree "$@"
        
        也就是说,通过适当的环境变量更改名称和电子邮件,对消息运行所需的任何筛选,并将其传递到正常运行的提交树调用
        sanitize
        是一个函数/脚本,用于对姓名/电子邮件进行一些私有->公共映射;如果您只想将它们全部更改为一个名称,那么这一点非常简单。sed命令可能有点花哨,例如读取一个转换表。这一点由你决定,取决于你需要做的消毒的复杂性

        如果您信任您的提交消息过滤,那么此时您就完成了。如果要验证,可以手动执行,也可以独立搜索“危险”字符串。例如,如果您有一个文件
        danger strings.txt
        ,您可以执行
        git log--pretty=“%an%ae%cn%ce%n%B”[branchs]| grep-f danger strings.txt
        。(log命令打印作者/提交人姓名/电子邮件,后跟提交消息。)

        然后以普通推送方式发布

        最后,为未来有不同需求的读者提供一些备选建议:

        • 进行新的提交,而不是重写提交。消息可以是快速版本控制信息(包括它所表示的内部提交的SHA1),也可以包括所引入的提交的简短日志(只是主题)。您可以通过保留发布分支并使用
          git merge--squash[--log]
          来实现这一点,或者在将内容复制到中之后,在单独的回购中提交fresh

        • 以不需要转换的形式保存回购协议。这对于OP来说似乎是不可能的,但是如果你的情况不同,就简单一点。风险越小,工作就越少


        Yikes。请求在reposito之间进行互操作