Git在很久以前的团队回购提交中更改作者姓名/电子邮件

时间:2015-09-16 02:17:42

标签: git github

在我创建此问题之前,我已经使用git filter-branch exportgit rebase阅读了答案,但这些都不适用于我的情况。

所以我加入了公司3个月,我在回购邮件上做的第一次提交是在计算机名称和电子邮件下(Unknown / something @ something),这是唯一一次使用该名称和电子邮件。现在,当我们在Jenkin中设置新工作时,电子邮件开始给我们带来麻烦,它开始向该地址发送电子邮件,这会导致每个人都收到退回的电子邮件。

我想将该特定提交的名称和电子邮件更改为我自己,以便我可以消除此问题。但问题是:

  • 这是一个团队回购,我不能使用filter-branch来重置所有电子邮件和名称。
  • 这个提交现在是HEAD背后的数千次提交,我无法手动进行rebase。
  • 在提交之后,有一些活动分支在master之后,它们尚未合并。

我真的在寻找一个解决方案,只更改作者的姓名和电子邮件,而且不会影响其他任何人。请帮忙。谢谢,真的很感激!

4 个答案:

答案 0 :(得分:3)

你不能。

如果您更改了提交的任何内容,甚至是单个字符或位,您将获得一个新的,不同的提交。如果有很多"下游"具有原始"错误"的提交 - 提交在他们的祖先某处提交作为父,祖父,曾祖父等等 - 然后每个提交都需要复制到一个新的,不同的提交ID,因为每个提交列出其父ID和那些父ID当您通过存储库更新父ID时,ID将发生变化。

这就是git声称强大的数据完整性"意味着:无法更改历史记录,而无需从该点开始更改所有SHA-1,即将所有旧提交复制到新提交。这被视为一项功能,当然,当您尝试在提交中修复某些辅助数据(如拼错或错误的用户名)时。 : - )

功能,可以将其他辅助数据附加到提交,而无需修改提交本身。注释工作的方式是检查提交的程序 - 例如git log - 首先通过提交SHA-1 ID读取提交本身,然后使用该ID作为密钥的一部分,以查看是否有人想要注意其他内容关于那个评论。 "其他"可以更改,即使SHA-1 ID不能。

此方法的问题在于您必须查看辅助数据。如果您正在使用git log,则默认会查找core.notesRef中列出的注释,而这些注释默认为refs/notes/commits。如果你正在使用别的东西,谁知道?

答案 1 :(得分:2)

  

我已经使用git filter-branch export和 git rebase 阅读了答案,但这些都不适用于我的情况。

实际上,我认为您最好的选择是以交互模式进行git rebase。如果有问题的提交发生了1000个来自您当前HEAD分支的提交,那么您可以输入:

git rebase -i HEAD~1000

您可以在提交之前编辑邮件,然后继续使用rebase。 rebase本身可能不会比你想象的那么痛苦,因为你实际上并没有触及代码本身。实际上,剩下的999左右的提交应该完全没有冲突。

  

我真的在寻找一个解决方案,只更改作者的姓名和电子邮件,而且也不会影响其他任何人。

不幸的是,你不能在不影响其他人的情况下这样做。通过更改相关提交的消息,您还可以重写历史记录。这意味着您必须强制将分支推送到远程。在执行此操作的过程中,您可以摒弃或惊讶当前在此分支上工作的所有其他用途。

所以这就是我的建议:

  • 让团队在包含错误电子邮件提交的分支上提交他们的所有工作(在完成下一步之前,他们不得触摸分支)
  • 然后,您可以拉动分支,执行交互式rebase,并强制推送到远程
  • 然后,团队的其他成员将删除(是的,你读对了)他们这个分支的本地副本
  • 最后,团队将从远程
  • 中提取已更正的分支

如果您按照这些步骤操作,我相信您可以轻松消除此电子邮件评论问题。

答案 2 :(得分:0)

我认为您的解决方案是使用git replace替换历史记录中的另一个提交。

  1. 在有问题的提交上创建分支

  2. 修改提交(不确定是否更改作者。否则,您必须完全使用技巧重新创建提交以覆盖当前日期GIT_COMMITTER_DATE="2000-01-01T12:00:00" git commit --date==2000-01-01T12:00:00

  3. 使用git replace将旧提交替换为新提交

  4. 希望jenkins了解git replace。如果是这样,它就完成了(很容易)。这个解决方案的附加价值就在这里。

  5. 如果没有,请使用git filter-branch,但它会影响每个人的历史记录(就像其他解决方案一样),而其他开发人员会讨厌你(但这个解决方案比纯粹的rebase更安全!)

答案 3 :(得分:0)

所以这是我刚才做的最终解决方案:

  • 让所有在该分支上工作的人都提交并将他们的工作合并回分支。
  • 将最新提交的副本保存到本地计算机。
  • 在我想要更改信息的提交之前,将分支回滚到提交权。
  • 硬拷贝本地副本并覆盖我刚刚回滚的代码。
  • 将其作为最新提交。