代码之家  ›  专栏  ›  技术社区  ›  Liquid Core

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

  •  -3
  • Liquid Core  · 技术社区  · 8 年前

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

    假设它有20个承诺。

    出于某种原因,sourcetree在改变项目设置方面很有意思,我错误地推了2个提交(比如commit 15和16,就像其他使用机器的同事一样)。

    我想把我的名字和邮件放在这些承诺中。

    让我们想象一下这棵树(没有树枝,只有主人)

    提交编号->注释->提交ID->作者/邮件

    • 18->提交评论blablabla->29huh23->me me@mycompany.com
    • 17->提交17个功能xyz->abs2881->me me@mycompany.com
    • 16->提交16个功能kwz->anu2716->someone other@othercompany.com
    • 15->提交15个功能ihz->11suhs2->someone other@othercompany.com
    • 14->提交14个功能uyz->1uhw87->me me@mycompany.com

    其他人@othercompany.com应该成为我。

    我是回购部的管理员。

    如何以简单的方式完成?从sourcetree可以吗?我应该从终点站开始吗?

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

    问题是不重复的,因为建议重复的答案不好用。

    编辑-正确的程序,任何人看不到太多的研究怎么做。

    因为每个人都将此标记为副本,而不是像其他程序一样 不完整 如果有人(像我一样)对Git的问题不太了解,正确的步骤是:

    从sourcetree启动终端,当repo打开时,终端按钮位于右上角。

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

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

    不过,这将产生一个二级“备份”分支,因为在重写历史时,这让我产生了很多疑问。

    我必须执行这个额外的步骤来删除“备份”分支,并实际将新的历史推送到repo,找到具有正确名称/邮件的新历史:

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

    Here 全方位指导。

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

    1 回复  |  直到 8 年前
        1
  •  4
  •   Mark Adelsberger    8 年前

    没有一种“简单”的方法可以做到这一点。作者和提交者信息是提交的一部分;更改它们会更改提交ID。更改提交ID意味着后续提交的父信息必须更改,并且更改 那些 提交的ID。换句话说,要改变它,你需要重写历史。

    历史重写并不特别困难,但是当受影响的提交已经共享时(或者更准确地说,当受影响的提交的“旧”版本将从分支的已共享历史中删除时),它们会带来巨大的成本。

    要进行这种重写,必须与已经收到“旧”提交的所有其他人进行协调。我经常听到人们说,这将是太沉重的,因为有多少人有回购。在这种情况下,你负担不起重写。如果你忽视了这一建议,可能会发生的是其他人,试图“修复”他们收到的错误,将撤消你的重写,然后你将有一个真正的分裂存储库,对任何人都没有什么用处,直到一个更大的协调工作完成清理它。

    尽管如此,如果你 仍然 想重写历史记录,只需清除一些提交的电子邮件地址,请签出 git filter-branch 与 --env-filter 选项。