更改特定提交的作者/邮件

时间:2018-05-29 11:19:54

标签: git bitbucket atlassian-sourcetree

我在bitbucket上有一个存储库,它与在线存储库(origin)对齐,同时使用Atlassian Sourcetree作为管理它的工具。

我们说它有20次提交。

由于某种原因,Sourcetree在改变项目设置方面有很大的乐趣,我错误地推了2次提交(让我们说提交15和16就像其他使用机器的同事一样。

我想把我的姓名和邮件放在这些提交中。

让我们想象这样的树(没有分支,只有主人)

提交号码 - >评论 - > commit id - >作者/邮件

  • 18 - >提交评论blabla - > 29huh23 - > me me@mycompany.com
  • 17 - >提交17特征XYZ - > abs2881 - > me me@mycompany.com
  • 16 - >提交16功能KWZ - > anu2716 - >某人other@othercompany.com
  • 15 - >提交15功能IHZ - > 11suhs2 - >某人other@othercompany.com
  • 14 - >提交14功能UYZ - > 1uuhw87 - > me me@mycompany.com

某人other@othercompany.com应该成为我。

我是回购管理员。

如何以简单的方式做到这一点?来自Sourcetree可以吗?我应该从终端做到吗?

手动修改.git文件夹中的文件并创建新的repo并在那里提交是否是一个可行的解决方案?

问题不重复,因为建议的重复答案效果不佳。

编辑 - 任何人在没有太多研究的情况下如何做到这一点的正确程序

由于每个人都将此标记为重复而不是,因为其他程序 INCOMPLETE 并且让某人(像我一样)对git问题和问题不是很酷,正确的程序是:

从SourceTree,当回购打开时,启动终端,右上角有终端按钮。

然后粘贴并执行,并使用适合您案例的替换

    #!/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

但是,这将产生一个辅助"备份"分支,因为在重写历史时,给我留下了很多疑问。

我必须执行此额外步骤才能删除"备份"分支并实际将新历史记录推送到回购并找到具有正确名称/邮件的新历史记录:

git push --force --tags origin 'refs/heads/*'

Here完整指南。

感谢所有向我指明正确方向的人。

1 个答案:

答案 0 :(得分:4)

没有"简单"这样做的方式。作者和提交者信息是提交的一部分;更改它们会更改提交ID。更改提交ID意味着后续提交'父信息必须更改,并且更改那些提交的ID。换句话说,要更改它,您需要重写历史记录。

历史记录重写并不是特别难以做到,但是当受影响的提交已经被共享时(或者更确切地说,当受影响的提交的旧版本将会出现时),它们会带来巨大的成本从已经共享的分支历史中删除。)

要进行这样的重写,有必要与已经收到" old"的其他人协调。提交。我经常听到人们说这会太繁琐,因为有多少人有回购。在这种情况下,您无法承担重写的费用。如果你忽略了这个建议,可能会发生的事情是其他人,试图修复"他们收到的错误会撤消您的重写,然后您将拥有一个真正分散的存储库,对任何人都没用,直到完成更大的协调工作来清理它。

尽管如此,如果想要进行历史记录重写只是为了清理一些提交'电子邮件地址,请使用git filter-branch选项查看--env-filter