我有一个Git diff创建
git diff --full-index --ignore-submodules > mypatch.diff
Run Code Online (Sandbox Code Playgroud)
当试图将它应用于另一个git repo(同一个远程分支,更高级的修订版)时,我在标题中得到错误
git apply --3way mypatch.diff
...
error: patch failed: dir/file:189
error: repository lacks the necessary blob to fall back on 3-way merge.
error: dir/file: patch does not apply
Run Code Online (Sandbox Code Playgroud)
多个文件会发生这种情况.
https://git-scm.com/docs/git-apply状态下的文档
当补丁不能干净地应用时,如果补丁记录了应该应用的blob的身份,则回退到三向合并,并且我们在本地可以使用这些blob,可能会将冲突标记留在工作树中的文件中供用户解决.
在我的情况下,有趣的是文件(Git术语中的blob)位于目标存储库中(甚至没有重命名),因此必须通过"git apply"找到它们.
注意:过去,命令序列已经工作了好几次.
tor*_*rek 14
您可能需要运行git fetch(并且您可能需要调整fetchrefspecs和/或使用--unshallow).
Git需要的blob是文件的特定版本(此时路径名无关紧要).
例如,考虑一下补丁:
diff --git a/fmt.py b/fmt.py
index 2069319..0c8a68f 100755
--- a/fmt.py
+++ b/fmt.py
@@ -207,7 +207,8 @@ def main():
Run Code Online (Sandbox Code Playgroud)
让我们来看看commit 7124b135...的版本fmt.py,然后是它的父版本:
$ git rev-parse 7124b135:fmt.py
0c8a68f9dc05a7399d06693c0b2761fb43ed0b58
$ git rev-parse 7124b135^:fmt.py
2069319dae4bd87cb6e1b7c18d86ebededeb00c8
Run Code Online (Sandbox Code Playgroud)
现在回头看看那一index ...行:
index 2069319..0c8a68f 100755
Run Code Online (Sandbox Code Playgroud)
有那些blob ID.Git将blob 2069319...与blob 进行比较,blob 0c8a68f...是显示的提交的父级中的版本,以及提交本身.
如果我要将此补丁发送给您,并且您要求您的Git应用它并且它不能完全应用,Git的"回退到三向合并"要求它找到或构建该文件的三个版本:您当前的一个,一个标识的2069319,和我的版本.
显然你的Git有你当前的版本,所以那里没有问题.显然它没有我的版本,所以它必须构建它.它可以构建它的方式是找到版本2069319.
您看到的投诉是因为您的Git无法在您的存储库中找到由..该index <sha1>..<sha1> <mode>行左侧的SHA-1 ID标识的任何内容.
(如果您的Git 可以找到该blob,它会将其提取到一个临时文件,将该补丁应用于该临时文件,因此拥有我的版本;然后它将具有进行三向合并所需的三个版本. )
如果修补程序针对当前位于存储库中的提交,则git fetch应该能够运行git fetch并获取该提交,这将获取与该提交关联的所有树和blob.
这git fetch需要拿起那个提交.git fetch通常接收的提交是refs/heads/*遥控器上的所有提交,由fetch =与特定遥控器相关联的线路控制,您还没有.1
远程中保留此blob的提交可能不存在refs/heads/*(例如,如果它现在只存在于存储中,或附加到过时的标记或已重新分支的分支).在这种情况下,git fetch可能不会带来必要的blob.如果您可以登录远程,有一种方法可以获取它:只需创建一个分支或标记,指向导致问题blob的提交.(找到这样的提交可能很难,除非你的补丁中有提交ID,然后它很容易.)然后指示你的Git从另一个Git获取那个分支或标记,你将得到必要的blob.
1请注意,如果您使用浅层克隆,Git将不会继续执行您现有的提交.你的提交在某个截止点结束,这就是你的克隆变浅的原因.如果丢失的blob毕竟在普通分支上,但是在"低于"截止点,则需要加深存储库,或者通过更深入的--depth=参数,或者通过添加--unshallow到fetch命令,以便加深它"所有的办法".
在浅克隆方面计算正确的深度是不可能的.(计数是:"我必须从分支提示中挖掘多少次提交才能进入目标提交?"在我们到达目的地之前,您在存储库中拥有的内容会停止,因此我们不知道它到底有多远我们可以计算你所有分支的走多远,并选择一个比这更大的数字,这肯定会加深你的存储库 - 但我们不知道这是不是正确的数字.)
这是可能在其他存储库,但如果你有到库的直接访问,你不必来算,你可以做一个分支或标记名称指向提交.
这到底是什么意思到目前为止最容易使用的东西git fetch --unshallow.
| 归档时间: |
|
| 查看次数: |
5580 次 |
| 最近记录: |