Git - 重写所有受影响的提交用户电子邮件 - 不适用于 activity
Git - Rewrite all affected commits user email - not working for activity
两年来,我在 Gitlab 上的许多存储库中提交了一堆提交。但是我意识到我没有设置正确的电子邮件。
我使用了git filter-branch
过滤历史和更改用户邮箱。
$ git filter-branch --env-filter '
OLD_EMAIL="old@example.com"
NEW_NAME="New Example"
NEW_EMAIL="new@example.com"
if [ "$GIT_COMMITTER_EMAIL" = "$OLD_EMAIL" ]
then
export GIT_COMMITTER_NAME="$NEW_NAME"
export GIT_COMMITTER_EMAIL="$NEW_EMAIL"
fi
if [ "$GIT_AUTHOR_EMAIL" = "$OLD_EMAIL" ]
then
export GIT_AUTHOR_NAME="$NEW_NAME"
export GIT_AUTHOR_EMAIL="$NEW_EMAIL"
fi
' --tag-name-filter cat -- --branches --tags
然后我用 git push --force
强行推送了这些更改。
它更新主分支上的贡献者。
在 git push --force --tags origin 'refs/heads/master'
之后,它也更改了标签上的贡献者。
问题:
它不会更改 Activity 页面上的提交。转到 {Repository} > Project information > activity(显示更新的贡献者)但单击任何提交编号 --> 它加载一个没有更新的贡献者的提交。
问题:
如何重写正确的历史记录,包括 activity 日志中发布的提交。
Activity 流是不可变的
不幸的是,activity 提要直接来自数据库事件记录,并且在创建记录后与 git 完全分离。据我所知,除非您具有数据库级别的访问权限,否则无法删除 activity 提要中的条目。
但是, 可以使用 git-filter-repo
和 运行 存储库清理来完全删除这些提交这样它们就不能在 GitLab 中被 查看 。 links 仍将存在于 activity 提要中,但是当您尝试查看 re-written/removed 提交 SHA 时,您将获得一个 404 页面。
另一种可能的解决方法是完全删除 activity 提要 -- 做
这个,只需导出您的项目,然后导入它。如果你在 before 推送 git-filter-repo 更改,那么所有提交的所有 activity 将显示为你推送这些更改的时间戳:
如果您在 之后执行此操作,则提要中将根本没有 activity:
来自 GitLab 的深度清理参考文献
除了分支上的提交之外,GitLab 还会保留(额外的)内部引用,这些引用通常在您克隆本地 git 存储库时不存在。包括合并请求、管道、注释和其他地方的引用。即使您更新 refs/heads/*
,您也可能需要更新遥控器上的其他参考,以便看到更改在不同地方生效。
这会破坏某些 UI 页面并可能导致数据丢失,但这是除了删除和重新创建项目之外让 GitLab 完全删除旧引用的唯一方法。
在开始之前通过导出备份您的存储库。
要彻底改变事物,您还需要改变这些引用:
refs/merge-requests/* for merge requests.
refs/pipelines/* for pipelines.
refs/environments/* for environments.
refs/keep-around/* are created as hidden refs to prevent commits referenced in the database from being removed
不幸的是,GitLab 不允许您直接访问其中一些“隐藏的引用”。要完全删除这些引用,您必须将项目导出到 tarball 并从 tarball 恢复本地 git 存储库,然后再次应用过滤器,并推送到远程。
导出您的项目,然后在 tarball 中有一个 project.bundle
文件。
git clone --bare --mirror ./project.bundle myrepo
cd myrepo
然后 彻底改变所有地方的电子邮件。
# replace with your actual filter-repo command needed
git filter-repo --name-callback '...' --email-callback '...' --commit-callback '...'
然后强制推回所有 refs,包括隐藏的 refs:
# reset the origin
git remote remove origin
git remote add origin https://gitlab.example.com/<namespace>/<project_name>.git
# push all refs
git push origin --force 'refs/heads/*'
# tags
git push origin --force 'refs/tags/*'
# prevent dead links to commits that no longer exist
git push origin --force 'refs/replace/*'
在此之后,您需要使用 git filter-repo
生成的 commit-map
初始化存储库清理。它位于 ./filter-repo/commit-map
的仓库中。它看起来像这样:
$ cat filter-repo/commit-map
old new
87c5016db64c6e8f4fc0feba4810b17c2c2222b5 2bb77407040e8a658eceacdf3034d24cedcc1ecd
cea6d9aa25e52dd755b694876a482a158debc60a 9a9b1d1a845d1096f4d3734191f883b52ffac6e9
5f1ac8c5fa47ac393d5e3f24b4b9812aaefbf5d7 b659497ed15ab0a3191dc5c6451c9440ca10d6e4
有了提交映射,转到设置 -> 存储库 -> 清理并上传 commit-map
文件。您会看到一条消息:
Repository cleanup has started. You will receive an email once the cleanup operation is complete.
一段时间后(取决于回购大小),旧的提交应该完全消失。
在 activity 提要中,如前所述,旧提交的 links 仍将 在那里:
但是,如果您单击 link,提交本身现在会生成 404,并且无法在 GitLab 中查看(永远消失!):
两年来,我在 Gitlab 上的许多存储库中提交了一堆提交。但是我意识到我没有设置正确的电子邮件。
我使用了git filter-branch
过滤历史和更改用户邮箱。
$ git filter-branch --env-filter '
OLD_EMAIL="old@example.com"
NEW_NAME="New Example"
NEW_EMAIL="new@example.com"
if [ "$GIT_COMMITTER_EMAIL" = "$OLD_EMAIL" ]
then
export GIT_COMMITTER_NAME="$NEW_NAME"
export GIT_COMMITTER_EMAIL="$NEW_EMAIL"
fi
if [ "$GIT_AUTHOR_EMAIL" = "$OLD_EMAIL" ]
then
export GIT_AUTHOR_NAME="$NEW_NAME"
export GIT_AUTHOR_EMAIL="$NEW_EMAIL"
fi
' --tag-name-filter cat -- --branches --tags
然后我用 git push --force
强行推送了这些更改。
它更新主分支上的贡献者。
在 git push --force --tags origin 'refs/heads/master'
之后,它也更改了标签上的贡献者。
问题:
它不会更改 Activity 页面上的提交。转到 {Repository} > Project information > activity(显示更新的贡献者)但单击任何提交编号 --> 它加载一个没有更新的贡献者的提交。
问题:
如何重写正确的历史记录,包括 activity 日志中发布的提交。
Activity 流是不可变的
不幸的是,activity 提要直接来自数据库事件记录,并且在创建记录后与 git 完全分离。据我所知,除非您具有数据库级别的访问权限,否则无法删除 activity 提要中的条目。
但是, 可以使用 git-filter-repo
和 运行 存储库清理来完全删除这些提交这样它们就不能在 GitLab 中被 查看 。 links 仍将存在于 activity 提要中,但是当您尝试查看 re-written/removed 提交 SHA 时,您将获得一个 404 页面。
另一种可能的解决方法是完全删除 activity 提要 -- 做 这个,只需导出您的项目,然后导入它。如果你在 before 推送 git-filter-repo 更改,那么所有提交的所有 activity 将显示为你推送这些更改的时间戳:
如果您在 之后执行此操作,则提要中将根本没有 activity:
来自 GitLab 的深度清理参考文献
除了分支上的提交之外,GitLab 还会保留(额外的)内部引用,这些引用通常在您克隆本地 git 存储库时不存在。包括合并请求、管道、注释和其他地方的引用。即使您更新 refs/heads/*
,您也可能需要更新遥控器上的其他参考,以便看到更改在不同地方生效。
这会破坏某些 UI 页面并可能导致数据丢失,但这是除了删除和重新创建项目之外让 GitLab 完全删除旧引用的唯一方法。
在开始之前通过导出备份您的存储库。
要彻底改变事物,您还需要改变这些引用:
refs/merge-requests/* for merge requests.
refs/pipelines/* for pipelines.
refs/environments/* for environments.
refs/keep-around/* are created as hidden refs to prevent commits referenced in the database from being removed
不幸的是,GitLab 不允许您直接访问其中一些“隐藏的引用”。要完全删除这些引用,您必须将项目导出到 tarball 并从 tarball 恢复本地 git 存储库,然后再次应用过滤器,并推送到远程。
导出您的项目,然后在 tarball 中有一个 project.bundle
文件。
git clone --bare --mirror ./project.bundle myrepo
cd myrepo
然后
# replace with your actual filter-repo command needed
git filter-repo --name-callback '...' --email-callback '...' --commit-callback '...'
然后强制推回所有 refs,包括隐藏的 refs:
# reset the origin
git remote remove origin
git remote add origin https://gitlab.example.com/<namespace>/<project_name>.git
# push all refs
git push origin --force 'refs/heads/*'
# tags
git push origin --force 'refs/tags/*'
# prevent dead links to commits that no longer exist
git push origin --force 'refs/replace/*'
在此之后,您需要使用 git filter-repo
生成的 commit-map
初始化存储库清理。它位于 ./filter-repo/commit-map
的仓库中。它看起来像这样:
$ cat filter-repo/commit-map
old new
87c5016db64c6e8f4fc0feba4810b17c2c2222b5 2bb77407040e8a658eceacdf3034d24cedcc1ecd
cea6d9aa25e52dd755b694876a482a158debc60a 9a9b1d1a845d1096f4d3734191f883b52ffac6e9
5f1ac8c5fa47ac393d5e3f24b4b9812aaefbf5d7 b659497ed15ab0a3191dc5c6451c9440ca10d6e4
有了提交映射,转到设置 -> 存储库 -> 清理并上传 commit-map
文件。您会看到一条消息:
Repository cleanup has started. You will receive an email once the cleanup operation is complete.
一段时间后(取决于回购大小),旧的提交应该完全消失。
在 activity 提要中,如前所述,旧提交的 links 仍将 在那里:
但是,如果您单击 link,提交本身现在会生成 404,并且无法在 GitLab 中查看(永远消失!):