【问题标题】:Find/Replace in Git Commit Log在 Git 提交日志中查找/替换
【发布时间】:2012-03-16 22:28:12
【问题描述】:

如何重写我们的提交历史以确保某些关键字永远不会出现?

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

  1. 本地 - 我们的开发环境。
  2. 内部 - 我们团队的私有 GH 存储库
  3. 客户 - 生产/最终客户。我们所有的真实姓名、电子邮件等都不能在这里出现。

我已经发现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

这看起来效果很好。当我推到最后一个遥控器时,我们的名字都不存在。但是,在某些合并时,我不希望任何分支名称或其他 cmets 可能意外出现。

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

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

谢谢!

【问题讨论】:

  • 哎呀。要求在真实姓名/电子邮件不能存在的存储库与它们必须存在的存储库之间进行互操作……至少可以说是有风险的。
  • 幸运的是,我将它们保存在单独的目录中,并将我可以使用的任何过滤器组合到推送脚本中。此外,这是一种方式。我永远不会从客户端存储库中提取代码 - 永远。希望这使它更简单(或不那么可怕)。
  • 只是:您仍在向可能泄露信息的方向移动数据。您是否真的需要在客户端有一个 repository,包含您在内部 repos 中所做的所有(可能重写的)提交?
  • 是的 - 客户希望看到即将发生的更改并执行他们自己的版本控制。另一种选择可能是从我的存储库构建一个包,并将它们应用到客户端存储库,并使用它自己的组合提交。我想避免这种情况,因为我们在这条路线上失去了很多宝贵的历史。

标签: git history privacy git-filter-branch


【解决方案1】:

好的,所以你想要做这样的事情的一般流程是:

  • 克隆/拉入未修改的存储库(可能每次都是新的,可能重复使用)
  • 运行过滤器分支,变魔术
  • 确认一切安全
  • 发布到客户端存储库

首先:魔法。你会想要使用git filter-branch --commit-filter my-commit-filter-script。它被直接调用而不是提交树,采用必要的参数和标准输入上的提交消息。所以你会想做这样的事情:

#!/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 命令可能有点花哨,例如读取转换表。这取决于您需要进行的清理工作的复杂程度。

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

然后正常发布 - 大概是推送。

最后,一些替代建议,也许是为未来有不同要求的读者提供的:

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

  • 以不需要转换的形式保存您的存储库。这对于 OP 来说似乎是不可能的,但如果您的情况不同,请保持简单。风险更低,工作更少。

【讨论】:

  • 不太适合我 - 这是我正在使用的/它输出的内容:gist.github.com/2127452 如果我不能以这种方式正常工作,我可能会采用您的替代建议并导出然后将其转储到新的存储库中。出于好奇和学习,我绝对想先尝试一下。仅供参考 - 通过“预推”,我的意思是我手动运行它,而不是作为 git 钩子。
  • 嗯,我不得不承认我没有测试它,而且我今天可能没有时间这样做。同时,由于它确实打印了一个使用声明,我建议记录标准输入、您正在通过管道传输到提交树的内容以及参数,并查看是否有明显错误。
猜你喜欢
  • 1970-01-01
  • 2012-10-30
  • 2016-06-27
  • 2010-12-11
  • 1970-01-01
  • 1970-01-01
  • 2013-07-25
  • 1970-01-01
  • 2013-01-13
相关资源
最近更新 更多