【问题标题】:git am: Patch format detection failed. git apply also failsgit am:补丁格式检测失败。 git apply 也失败了
【发布时间】:2019-09-23 04:14:11
【问题描述】:

我正在尝试学习 git 补丁,所以我设置了一个测试 repo 并提交了一些提交。

然后我创建了一个补丁:git format-patch -1 HEAD --stdout > changes.patch

接下来,我检查了一个新分支并尝试使用changes.patch:git am .\changes.patch。它给了我错误Patch format detection failed.

我在这里搜索,发现this related question

所以我尝试了git apply .\changes.patch。它给了我error: unrecognized input

补丁文件对我未经训练的眼睛来说似乎很好:

From 1c054c05bc528afbd929a1744fcacf9d70069246 Mon Sep 17 00:00:00 2001
From: MyUsername <my.email@gmail.com>
Date: Sat, 4 May 2019 22:43:32 -0400
Subject: [PATCH] Commit 4

---
test.txt | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/test.txt b/test.txt
index 58ef11d..763fe4e 100644
--- a/test.txt
+++ b/test.txt
@@ -1,3 +1,4 @@
 Initial commit
 Commit 2
-Commit 3
\ No newline at end of file
+Commit 3
+Commit 4
\ No newline at end of file
-- 
2.21.0.windows.1

我认为补丁可能与 repo 位于同一目录中,因此我将其移至另一个目录。结果是一样的。

我也注意到很多人在命令中有&lt;,所以我试了一下:git am &lt; ..\changes.patch。显然这不是有效的语法。

这是在带有 PowerShell 的 Windows 上使用 64 位 git。

有什么想法吗?

【问题讨论】:

    标签: git git-patch git-am git-apply


    【解决方案1】:

    试试cat .\changes.patch | git am

    但我不知道为什么git am .\changes.patch 不能工作。

    更新:

    changes.patch 默认在USC-2 Little Endian 中。将其更改为UTF-8 后,git am .\changes.patch 有效。

    【讨论】:

    • 有趣。它确实奏效了!我会试着看看我能不能找出原因。
    • @Danation 经过一番研究,我发现它是由changes.patch 的编码引起的。 Powershell 在USC-2 Little Endian 中生成补丁。将其更改为UTF-8 后,git am .\changes.patch 有效。
    • 很高兴解开这个谜团!我觉得我有这个编码问题很奇怪,所以我搜索了更多。据此stackoverflow.com/a/13751617/1192877,罪魁祸首是--stdout,以及PowerShell如何处理输出。我试了一下,确实如此:没有--stdout,生成的文件可以正常工作。
    • 是 UCS-2 还是 UTF-16-LE? (区别在于 UCS-2 不允许代理转义。)
    • @torek Notepad++ 告诉它是 USC-2 Little Endian。
    【解决方案2】:

    您想从HEAD 创建补丁吗?然后您可以简单地执行以下操作:

    保存补丁:

    git show HEAD > /some/location/patch.txt
    

    要应用补丁:

    git apply /some/location/patch.txt
    

    如果你想从一堆提交中创建一个补丁,你可以这样做:

    git diff OLDEST_COMMIT..NEWEST_COMMIT > /some/location/patch.txt
    

    例如,通过这种方式,您可以创建一个包含来自功能分支的更改的补丁:

    git diff origin/master...origin/new_feature > /some/location/feature.patch
    

    请注意这三个点,它们表示您想要 origin/new_feature 中包含的关于两个分支的共同祖先的更改。

    【讨论】:

    • 我的目标是学习如何将git format-patchgit am 用于需要通过电子邮件进行协作的特定项目。在这种情况下,我只是使用 HEAD 作为测试用例。
    • 如果你想将补丁作为附件发送,你可以这样做。您可以通过任何方式共享此文件。
    • 我喜欢git am 的一点是它保留了贡献者的提交历史。据我了解,git apply 就像接收者就是作者一样。
    • 好的。我不熟悉 git format-patch / git am。我偶尔会使用git apply 并且不需要那些额外的信息。很高兴知道。
    猜你喜欢
    • 2018-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多