我正在从克隆的GitHub仓库创建一些补丁,我已经添加了一系列小型提交,因为我希望forked repos能够进行补丁。
我使用msysgit.github.io
(版本1.9.5)中最新的基于MinGW的Windows版本的GIT。
第一个补丁只是将一系列HTML文件中的脚本标记更改为指向更高版本的jQuery,因此它只是简单的行替换。
我使用git log -3
获取提交guid,然后使用eg。
git diff e004912b5ce29ac0d0cb04df50fe66db5e3af9ea 574391effbdfcb187cf5695e28558d5ace5bdefd > ../patches/test.patch
奇怪的是,当我用
应用补丁时 git apply ../patches/test.patch
在提交e004912b5ce29ac0d0cb04df50fe66db5e3af9ea的原始仓库中,它失败并且补丁失败'和'补丁不适用消息。
它在一个文件中出错,但是如果删除差异的那一部分,则补丁可以正常工作。我使用Notepad ++,所以我可以看到标签/空格和行结尾为CR / CRLF,而不是那样。
甚至更奇怪,当我应用编辑过的补丁,然后手动将失败的更改应用于那个文件,提交并创建一个新补丁时,它不仅与第一个补丁字节相同,而且也失败相同。
所以我100%确定这是一个错误。文件或补丁没有问题。它阻止我发布这些补丁。
可能导致这种情况的原因是什么?我正在复制克隆仓库的本地版本,该版本位于e004912b5ce29ac0d0cb04df50fe66db5e3af9ea,因此我不知道索引是如何被破坏的或类似的东西。这是Windows GIT的已知问题吗?
编辑:
好的,它是行结尾。看看这个(显示在Notepad ++中),AutoToolTips.html是问题孩子:
因此,使用\r\n
查找/替换\n
修复了此问题。
道歉,我确信我早些时候已经检查过了。
为什么这个特定文件的处理方式与补丁中的其他文件不同,仍然存在一个谜。 在GitHub存储库中,所有文件都设置为LF(unix行终止)。 Git for windows设置为将所有文件转换为CRLF格式,然后在提交时再次返回LF。这是一致的 - 我所有的本地文件都有CRLF终止。
这可能是特定于该文件的Git元属性中隐藏的内容吗?如果是这样,我将如何找到该物业?