1

一位同事从他的 git repo 中向我发送了一个补丁。由于它不是克隆,因此他的index条目包含我的仓库中不知道的哈希值。样本:

index 20589f5..bbdd152 100644

20589f5存在于他的仓库中,但不在我的仓库中。

当我尝试使用 TortoiseMerge 应用补丁时,我收到消息

fatal: not a valid object name

我怎么能欺骗 TortoiseMerge 接受补丁?


编辑:它不一定是 TortioseMerge。任何其他可以让我直观地应用我的补丁(并在 Windows 上运行,最好是免费的)的工具也很好。

4

3 回答 3

3

Git 补丁实际上只是 mbox 格式的统一差异。如果您不关心 Git 元数据或合并历史记录,您可以将补丁文件直接提供给命令行上的补丁命令。例如:

cd /path/to/project
patch < 0001-foo.patch

这当然有效,但是如果维护历史对您很重要,那么使用 git-bundle(1) 传输完整的分支可能是更好的方法。

于 2012-06-28T10:12:01.170 回答
2

由于它来自一位同事,因此最好的答案是让他提供缺失的数据,或者通过补丁系列或让您从他的存储库中获取。如果你能得到这些数据,任何其他路线都只是浪费时间。

否则,您有一个补丁不能完全应用于您当前的工作树,并且您没有足够的信息来执行 3 路合并。

现在,如果您仍然想尝试应用补丁,我建议使用git am(或者git apply,如果他提供了差异而不是补丁——这是不好的做法)尝试应用补丁。您可以使用该--reject选项强制尽可能多地应用它。Git 将为没有完全适用于当前树的差异块创建“.rej”文件。然后,您可以尝试手动应用这些。

另一种选择是通过编辑器手动应用整个补丁。

无需patch按照其他地方的建议使用。git apply将永远是可取的。

现在,你想在视觉上做到这一点,我能提供的最好的建议--interactivegit apply. 这将允许您逐个应用补丁块。

您不能使用 Tortoisemerge 执行此操作,因为 Tortoisemerge需要两个或三个完整的文件才能执行合并。由于您的索引值与存储库中的已知 blob 不对应,因此您无法向 Tortoisemerge 提供完整的基本文件修订。

于 2012-08-20T00:23:18.530 回答
1

如果您在没有任何参数的情况下手动启动 TortoiseMerge,则会出现一个对话框提示您在“合并”和“应用统一差异”之间进行选择。选择后者并将补丁选择为“Diff 文件”,并将您的 Git 工作树选择为“目录”。按下“确定”后,会出现一个窗口,其中列出了修补程序修改的所有文件。然后单击“修补所有项目”或选择一个文件并单击“修补选择项目”。这将在 TortoiseMerge 中直观地应用补丁。

于 2012-08-17T05:40:50.707 回答