如何从外国仓库中直观地应用补丁到我的?

时间:2012-06-28 09:57:53

标签: git patch

一位同事从他的git repo寄给我一个补丁。由于它不是克隆,因此他的index条目包含我的仓库中未知的哈希值。样品:

index 20589f5..bbdd152 100644

20589f5存在于他的回购中但不在我的回购中。

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

fatal: not a valid object name

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


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

3 个答案:

答案 0 :(得分:3)

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

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

这当然有效,但如果保持历史记录对你很重要,那么使用git-bundle(1)来传输一个完整的分支可能是一个更好的方法。

答案 1 :(得分:2)

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

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

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

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

根据其他地方的建议,无需使用patchgit apply始终是首选。

现在,您希望直观地进行此操作,我可以提供的最佳建议是--interactive的伪视觉git apply模式。这将允许您通过hunk应用修补程序块。

你不能用Tortoisemerge这样做,因为Tortoisemerge is expecting有两三个完整的文件来执行合并。由于您的索引值与存储库中的已知blob不对应,因此您无法向Tortoisemerge提供完整的基本文件修订。

答案 2 :(得分:1)

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