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

时间:2016-08-11 18:36:42

标签: git github git-commit git-filter-branch git-rewrite-history

所以我想改写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日之后的某个日期之后只更改提交的要求吗?

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

1 个答案:

答案 0 :(得分:0)

  

这会使重写历史更安全吗?

如果有人克隆了您即将重写的提交, 历史发生变化时,他们会感到惊讶。 如果他们在原始提交之上有本地提交, 一些清理工作是必要的,但应该可以轻松完成。 由于您的回购似乎没有太多使用, 风险似乎微不足道,最糟糕的情况是轻微的不便。

  

有人可以改变这一点,以包括我在6月20日之后的某个日期之后只更改提交的要求吗?

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

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

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

备份分支,例如:

git branch master-bak

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

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

git reset --hard master-bak