在已发布的回购中修改 Git 作者

Amending Git Author In a Published Repo

所以我想重写 git 存储库的历史记录。现在,我想更改的所有提交都已经发布并推送,我知道将历史重写为已发布的回购协议是不好的做法。然而,这个 repo 没有分叉,只有一个主分支。这会让重写历史更安全吗?

如果是这样,我想做的是将特定作者自特定日期以来所有提交的作者更改为新作者。这是 github 提供的代码:

#!/bin/sh

git filter-branch --env-filter '
OLD_EMAIL="your-old-email@example.com"
CORRECT_NAME="Your Correct Name"
CORRECT_EMAIL="your-correct-email@example.com"
if [ "$GIT_COMMITTER_EMAIL" = "$OLD_EMAIL" ]
then
    export GIT_COMMITTER_NAME="$CORRECT_NAME"
    export GIT_COMMITTER_EMAIL="$CORRECT_EMAIL"
fi
if [ "$GIT_AUTHOR_EMAIL" = "$OLD_EMAIL" ]
then
    export GIT_AUTHOR_NAME="$CORRECT_NAME"
    export GIT_AUTHOR_EMAIL="$CORRECT_EMAIL"
fi
' --tag-name-filter cat -- --branches --tags

有人可以更改它以包括我的要求,即只更改自特定日期(例如,6 月 20 日之后)以来的提交吗?

此外,是否可以在看到效果后轻松撤消此更改?

Does this make rewriting history safer?

如果有人克隆了您要重写的提交, 当历史改变时,他们会感到惊讶。 如果他们在原始提交之上有本地提交, 一些清理是必要的,但应该不费吹灰之力就可以完成。 由于您的回购协议似乎没有太多使用, 风险似乎可以忽略不计,最坏的情况是带来轻微的不便。

Can somebody change this to include my requirement of only changing commits since a certain date, say, after June 20th?

我认为您不能将日期限制指定为 git filter-branch。 但是您可以指定一系列修订。 我建议找到要进行更改的修订版, 例如通过查看 git log --before 'June 20'。获得 SHA 后,像这样更改脚本的结尾部分:

git filter-branch --env-filter '
# ... no change, as in your post
' -f SHA..

Also, is it possible to easily undo this change after seeing the effects?

备份分支,例如:

git branch master-bak

这将创建当前分支的副本。正如您所写,您只有一个 master 分支,我假设您现在在 master 上, 所以这将创建它的备份。

如果您对上述 git filter-branch 命令的结果不满意, 您可以使用以下命令从备份恢复分支的原始状态:

git reset --hard master-bak