在我创建此问题之前,我已经使用git filter-branch export
和git rebase
阅读了答案,但这些都不适用于我的情况。
所以我加入了公司3个月,我在回购邮件上做的第一次提交是在计算机名称和电子邮件下(Unknown / something @ something),这是唯一一次使用该名称和电子邮件。现在,当我们在Jenkin中设置新工作时,电子邮件开始给我们带来麻烦,它开始向该地址发送电子邮件,这会导致每个人都收到退回的电子邮件。
我想将该特定提交的名称和电子邮件更改为我自己,以便我可以消除此问题。但问题是:
我真的在寻找一个解决方案,只更改作者的姓名和电子邮件,而且不会影响其他任何人。请帮忙。谢谢,真的很感激!
答案 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左右的提交应该完全没有冲突。
我真的在寻找一个解决方案,只更改作者的姓名和电子邮件,而且也不会影响其他任何人。
不幸的是,你不能在不影响其他人的情况下这样做。通过更改相关提交的消息,您还可以重写历史记录。这意味着您必须强制将分支推送到远程。在执行此操作的过程中,您可以摒弃或惊讶当前在此分支上工作的所有其他用途。
所以这就是我的建议:
如果您按照这些步骤操作,我相信您可以轻松消除此电子邮件评论问题。
答案 2 :(得分:0)
我认为您的解决方案是使用git replace替换历史记录中的另一个提交。
在有问题的提交上创建分支
修改提交(不确定是否更改作者。否则,您必须完全使用技巧重新创建提交以覆盖当前日期GIT_COMMITTER_DATE="2000-01-01T12:00:00" git commit --date==2000-01-01T12:00:00
)
使用git replace将旧提交替换为新提交
希望jenkins了解git replace。如果是这样,它就完成了(很容易)。这个解决方案的附加价值就在这里。
如果没有,请使用git filter-branch,但它会影响每个人的历史记录(就像其他解决方案一样),而其他开发人员会讨厌你(但这个解决方案比纯粹的rebase更安全!)
答案 3 :(得分:0)
所以这是我刚才做的最终解决方案: