在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
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
这似乎很有效。当我推到最后一个遥控器时,我们的名字都不在了。然而,在一些合并中,我不希望出现任何分支名称或其他评论
此外,我希望我们的实际电子邮件和用户名继续配置,使我们的内部项目管理系统的工作,是透明的
如何确保关键字或名称列表不会出现在提交消息中?还有,还有其他解决这个问题的方法吗
谢谢 好的,这样做的一般流程是:
- 克隆/拉入未修改的回购协议(可能每次都是新的,可能重复使用)
- 运行过滤器分支,做魔术
- 确认一切都是安全的
- 发布到客户回购协议
#!/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),也可以包括所引入的提交的简短日志(只是主题)。您可以通过保留发布分支并使用
来实现这一点,或者在将内容复制到中之后,在单独的回购中提交freshgit merge--squash[--log]
- 以不需要转换的形式保存回购协议。这对于OP来说似乎是不可能的,但是如果你的情况不同,就简单一点。风险越小,工作就越少
- 克隆/拉入未修改的回购协议(可能每次都是新的,可能重复使用)
- 运行过滤器分支,做魔术
- 确认一切都是安全的
- 发布到客户回购协议
- 好的,这样做的一般流程是:
#!/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),也可以包括所引入的提交的简短日志(只是主题)。您可以通过保留发布分支并使用
来实现这一点,或者在将内容复制到中之后,在单独的回购中提交freshgit merge--squash[--log]
- 以不需要转换的形式保存回购协议。这对于OP来说似乎是不可能的,但是如果你的情况不同,就简单一点。风险越小,工作就越少