一位同事从他的git repo寄给我一个补丁。由于它不是克隆,因此他的index
条目包含我的仓库中未知的哈希值。样品:
index 20589f5..bbdd152 100644
20589f5
存在于他的回购中但不在我的回购中。
当我尝试使用TortoiseMerge应用补丁时,我收到消息
fatal: not a valid object name
我怎么能欺骗TortoiseMerge接受补丁?
编辑:它不一定是TortioseMerge。任何其他工具,让我可以直观地应用我的补丁(并在Windows上运行,最好是免费)也很好。
答案 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'文件,这些文件不能完全应用于当前树。然后,您可以尝试手动应用这些。
另一种选择是通过编辑器手动应用整个补丁。
根据其他地方的建议,无需使用patch
。 git apply
始终是首选。
现在,您希望直观地进行此操作,我可以提供的最佳建议是--interactive
的伪视觉git apply
模式。这将允许您通过hunk应用修补程序块。
你不能用Tortoisemerge这样做,因为Tortoisemerge is expecting有两三个完整的文件来执行合并。由于您的索引值与存储库中的已知blob不对应,因此您无法向Tortoisemerge提供完整的基本文件修订。
答案 2 :(得分:1)
如果您手动启动TortoiseMerge而没有任何参数,则会出现一个对话框,提示您选择“合并”和“应用统一差异”。选择后者并选择补丁作为“Diff文件”,将Git工作树选为“目录”。按“确定”后,会出现一个窗口,其中列出了修改修补程序的所有文然后点击“修补所有项目”或选择一个文件,然后点击“修补选择项目”。然后,这将在TortoiseMerge中直观地应用补丁。