Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
git apply神秘地失败了,我如何进行故障排除/修复?_Git_Patch - Fatal编程技术网

git apply神秘地失败了,我如何进行故障排除/修复?

git apply神秘地失败了,我如何进行故障排除/修复?,git,patch,Git,Patch,我目前正在尝试对(github)存储库的PRs进行代码样式检查,我希望向提交者提供补丁,让他们可以轻松地修复代码样式。为此,我将调低他们的PR,在其上运行我们的uncrustify脚本以修复任何样式错误,并希望创建一个他们可以轻松应用的.patch文件。但是,它在某些文件上始终会中断 我知道(git版本1.7.10.4,带有core.autocrlf=input,core.filemode=false): $git签出公共关系分支 $git日志-1(显示:commit dbb8d3f) $git

我目前正在尝试对(github)存储库的PRs进行代码样式检查,我希望向提交者提供补丁,让他们可以轻松地修复代码样式。为此,我将调低他们的PR,在其上运行我们的uncrustify脚本以修复任何样式错误,并希望创建一个他们可以轻松应用的.patch文件。但是,它在某些文件上始终会中断

我知道(git版本1.7.10.4,带有
core.autocrlf=input
core.filemode=false
):

$git签出公共关系分支
$git日志-1(显示:commit dbb8d3f)
$git状态(无需提交,工作目录清理)
$ 
$git diff>。/style.patch(因此补丁文件位于repo之外)
$git reset——硬头(模拟提交方端的情况)
$git日志-1(显示:commit dbb8d3f)
$git状态(无需提交,工作目录干净,所以我们就从这里开始)
$git apply../style.patch
错误:修补程序失败:somefile.cpp:195
错误:somefile.cpp:修补程序不适用(使用--check选项的输出相同)
这只适用于某些文件,而不是所有文件。我不知道如何解决这个问题,也就是说,如何让git告诉我到底哪里出了问题——当我挖掘时,它只告诉我一个大块头,但这仍然是相当大的问题

到目前为止我所做的尝试(没有成功):

  • apply--reverse
    apply--whitespace=nowarn
  • diff头
    而不是单独的
    diff
  • 进行虚拟提交(提交工作没有问题!),使用
    格式补丁
    ,删除虚拟提交,使用
    git am
    应用补丁,使用或不使用
    -3
    ,或使用
    git apply
  • 将补丁文件放在本地目录中,而不是放在上面(抓紧稻草,这里)
  • 检查git diff、-apply、-format patch、-am的手册页,了解有用的信息
  • 使用linux
    patch
    命令进行修补
  • 我不知道差异有什么问题。空白的东西应该只是警告,对吗?在任何情况下,我都不想忽略它们,因为这是一个明显涉及空白的风格修正

    我如何修复/诊断此问题,甚至如何找到它的确切位置?如果我公布其中一个罪犯档案的差异会有帮助吗?同样让我困惑的是,committ可以毫无问题地工作,但是从commit创建的补丁却不能


    经过几个小时的努力,我的知识已经不多了……

    更新:

    您可以使用
    git apply-v
    查看有关正在进行的操作的更多详细信息,
    git apply--check
    验证操作,或者使用
    git apply--index
    重建本地索引文件

    根据您的评论,您的本地索引似乎已损坏,因此
    index
    解决了此问题

    我将留下我最初的答案和评论,主要是为了给人们提供关于发生了什么的背景,因为我怀疑其他人会跳到与我根据问题描述得出的相同的初始结论

    ----

    最有可能的是,diff没有问题。相反,请查看目标git存储库。当您执行
    git reset--hard HEAD
    时,没有任何东西可以保证另一个存储库上的
    HEAD
    与您的存储库上的
    HEAD
    相同

    在目标回购上执行git日志,并查看顶部的提交。它和你制作差异的那个一样吗?很可能不是。查看历史记录并检查是否存在您需要的提交。如果是,那么目标回购就在你之前,你必须回去,对目标回购做
    git-pull
    (或
    git-rebase
    )并产生新的差异。如果不是,那么目标回购就在你之后,你需要对目标回购做
    git-pull
    (或
    git-rebase
    )以加快速度


    请记住,如果您有其他人向您的“主”repo(bot-yours和目标存储库正在从中提取)提交请求,您可能必须
    git-pull
    这两个存储库,以使它们进行合理的最近常见提交。

    尝试检查您的补丁文件-例如:

    git apply --reject mypatch.patch
    
    这将向您展示差异(如果有的话)-下面是一个示例,说明它的外观:

    error: patch failed: <filename>:<linenumber>
    error: while searching for :
        cout << "}" << endl; // example of a line in your patch
    
    错误:修补程序失败::
    错误:在搜索时:
    
    cout在这种情况下,如果您已经尝试了下面列出的所有选项:

  • 调查文件中潜在的不可打印/不可见字符
  • 使用
    dos2unix
    进行转换
  • 更改git配置以调整处理行结尾的方式,例如:
  • 在这种情况下,邪恶的另一个根源可能是你的IDE

    例如,一些JetBrains IDE(如PHPStorm)具有以下选项:

    今天花了4个多小时处理一个奇怪的补丁问题,结果出现以下错误:

    git apply < my.git.patch --verbose
    ...
    error: patch failed: plugins/some/file.php:74
    
    git-apply
    我意识到我是编辑的受害者(我不确定这是否是默认行为)

    我正在使用PHPStorm检查补丁文件,它正在悄悄地从补丁文件中删除一个空白,该空白实际上存在于需要修补的目标文件中

    这真是太狡猾了,我最终将Save for
    选项中的
    删除尾随空格设置为
    None
    ,这样就再也不会碰到这样的问题了


    还请记住,与平台相关的差异,如底层文件系统(MacOS/Linux for eg)的区分大小写,也可能是可疑的。

    在我上面描述的过程中,当前头部对于diff创建和diff应用程序都是相同的。这是该分支中的最后一次提交。我做重置完全是为了消除来自不同头脑的任何问题。所以这不可能。已自动处理必要时的更新,但
    git config --global core.autocrlf input
    
    git apply < my.git.patch --verbose
    ...
    error: patch failed: plugins/some/file.php:74