git:空的身份标识名称(对于<>)不被允许。

45

我正在使用git-am在我的代码库中应用一个开源项目的diff文件

 git am -3 < /Downloads/refactorWork.diff

但是它有冲突,我需要解决它们;在解决冲突并暂存后,当我执行git am --continue时,出现以下问题:

fatal : empty ident name (for <>) not allowed

我在互联网上查找并发现这个问题似乎与我的问题相似,但我的用户名和电子邮件已经添加到全局和本地git目录中。以下是git config列表的输出:

rohan@~/Documents/libo : $ git config --global --list
user.email=rohankanojia420@gmail.com
user.name=Rohan Kumar
alias.l=log --oneline --graph --pretty
credential.helper=cache

虽然我通过首先提交暂存的更改,然后使用git am --skip解决了这个问题,但我想知道这个错误是什么意思,以及我所做的是否正确,或者是否有更好的方法?

4个回答

44

这个 diff 文件是一个普通的 diff,不是由 git format-patch 生成的。由 format-patch 生成的 diff 包含有关提交作者、作者日期、提交消息等信息,并在创建提交时维护此信息。

您的普通 diff 没有这些信息,因此 git am 将抱怨缺少这些信息,这是很自然的。

相反,您应该使用 git apply,它用于应用像您在本例中拥有的简单补丁文件,它只会将补丁应用到工作树(如果您告诉它的话还会应用到索引),但不会自动创建任何提交。


1
哦,原来是在抱怨差异文件。感谢你解决了我的疑惑。我知道这个补丁会导致冲突。如果使用git apply的话,就会失败,所以我使用了git am,因为我读到它可以显示冲突并给出解决的机会。 - Rohan Kumar
2
由于所涉补丁包含了其相应的二进制大对象(blobs)- 假设这些 blobs 在你的代码库中是可用的 - 你可以使用-3选项回退到三路合并,最终生成带有冲突标记的文件供你解决。除此之外,你还可以使用--reject选项来应用适用的补丁块,并为不适用的补丁块创建.rej文件以供审查和手动应用。若没有任何选项,则在某些内容不能被应用时,apply会失败。但在内部,git am也使用git apply - Vampire
也许通过设置GIT_AUTHOR_EMAIL和/或GIT_AUTHOR_NAME环境变量,可以使git am在没有错误的情况下工作。 - Vampire
如果有人想知道,TortoiseGit的“应用”按钮似乎实际上运行的是git am而不是git apply。此外,“创建补丁序列”按钮似乎创建普通补丁。(半相关): 我不确定我是否错过了什么,但这似乎是一个奇怪的设计决定。如果Tortoise通过GUI生成无法在不回退到git命令行的情况下使用的补丁,那么它似乎正在让人们失败。 - jrh
2
我认为你没有正确使用。如果你使用“创建 Patch 串”并点击“确定”,它将使用format-patch来创建补丁,如果你使用“应用 Patch 串”,它将使用am来回放这些补丁。如果你使用“创建 Patch 串”并使用“保存自头部以来的统一 diff”,它会创建一个纯 diff,并可以通过右键单击补丁文件并使用“查看/应用单个补丁”来回放。即使你只有一个format-patch生成的补丁文件,你也应该使用“应用 Patch 串”。 - Vampire
@Vampire,你的评论帮助我解决了这个问题。谢谢。 - Farhan

9

当你遇到冲突时,请使用

git apply -3 patchName.patch

打开合并工具并解决冲突

git mergetool

就这样 :)


4

从评论中移出并放入接受的答案

当您在TortoiseGit中单击“保存统一的差异”时,您必须右键单击创建的.diff.patch文件,然后选择TortiseGit→Review/apply single patch而不是Apply Patch Serial...

首先将差异文件放在要应用补丁的文件夹的根目录中。


3
我有一个补丁看起来很好,包括提交信息、作者头部等。
我比较了 git-format-patch 的输出,发现它使用的是 From: 头部而不是 Author: 头部。
果然,如果你将 Author: 改为 From:,git-am 就可以顺利应用这个更改。

哇,真是个意外!今天我学到了。谢谢!我有一个 git diff > patch 这样的完全没有作者信息的文本补丁,只有在前面加上 From: me <me> 这一行(字面意思)才能让 git am -3 正常工作。然后我运行了 git reset --soft HEAD~1 && git reset,做了其他更改并提交了合并后的更改。感觉这不是故意的;git am -3 应该将 Author: 识别为 From: 的替代品。 - vulcan raven

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接