使用filter-branch更改git commit author时出错

时间:2016-05-08 01:05:17

标签: git atlassian-sourcetree git-filter-branch refs

我正在尝试为我的git提交更改作者,因为我忘记更新我的全局电子邮件。我使用下面的代码进行更改(使用我自己的详细信息)。

git filter-branch --env-filter '
OLD_EMAIL="OldEmail"
CORRECT_NAME="new name"
CORRECT_EMAIL="new email" 
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

脚本运行但后来说:

Ref 'refs/heads/master' was rewritten
Could not rewrite refs/heads/master

我是一个git新手,在任何地方都找不到这个错误是否与用户有关?我试图通过源代码树运行它是我缺少的东西吗?

由于

1 个答案:

答案 0 :(得分:0)

在 Windows 上,您现在有了更好的选择:

改用其可能的后继:newren/git-filter-repo(在 Python 中)及其 example section

cd repo
git filter-repo --mailmap my-mailmap

带有my-mailmap

Correct Name <correct@email.com> <old@email.com>

这将用 <old@email.com>

替换任何人所做的任何提交的作者姓名和电子邮件

有关映射文件语法的示例,请参阅 gitmailmap documentation


Could not rewrite”的另一个可能原因已通过 Git 2.32(2021 年第 2 季度)解决。

请参阅 commit 42efa12commit 98fe9e6commit 6d875d1Jeff King (peff)(2021 年 3 月 10 日)。
(由 Junio C Hamano -- gitster --commit d4bda9b 合并,2021 年 3 月 22 日)

<块引用>

filter-branch:删除多祖先警告

签字人:Jeff King

<块引用>

当一个引用映射到一个既没有被过滤分支重写也没有保留的提交时(例如,因为它被 rev-list 的路径规范选择消除了),我们将它重写到它最近的祖先。

自从 6f6826c 中的初始提交(“Add git-filter-branch”,2007-06-03,Git v1.5.3-rc0 -- merge)以来,我们已经警告当有地图文件中有多个这样的祖先。
但是,这些天警告代码是不可能触发的。
由于 a0e4639 ("filter-branch: fix ref rewriting with --subdirectory-filter", 2008-08-12, Git v1.6.1-rc1 -- merge),我们找到了祖先使用“rev-list -1”,所以它只能有一个值。

由于我们在映射祖先时附加到映射文件这一事实,使这段代码更加混乱。
但是,这永远不会产生多个值,因为:

  • 我们明确地检查地图是否已经存在,如果存在,什么都不做(所以我们的“追加”将始终是一个不存在的文件)
  • 即使我们尝试映射两次,这样做的过程也是确定性的。
    即,对于给定的 sha1,我们总是以相同的祖先结束。
    所以警告它是没有意义的;没有歧义。

因此将 BUG 的警告代码换掉(我们将在下一次提交中进一步简化)。
并且让我们停止使用 append 操作符来减少祖先映射代码的混乱。

没有了

<块引用>

警告:'$ref' 被重写为多个提交:" 警告:Ref '$ref' 现在指向第一个 无法重写 $ref

相反:

<块引用>

致命:BUG:地图文件中有多个祖先?