我用三个提交创建了一个补丁
git format-patch <revision_three_commits_ago>
Run Code Online (Sandbox Code Playgroud)
这会创建三个我从笔记本邮寄的补丁文件,并在我的桌面计算机上读取邮件(两个都是Windows框).
我什么时候做
git am --3way --ignore-space-change *.patch
Run Code Online (Sandbox Code Playgroud)
补丁适用,但我没有为提交获得相同的SHA1 ID.在修补文件中搜索了一下,我发现台式计算机上的修改后的行结束了LF,而笔记本上的修改后的行(我创建了修补程序)结束了CR LF.
所以,我的第一个念头就是打电话给git am没有--ignore-space-change,但是这给了我一个错误(补丁不适用).
我怎么能告诉git format-patch或者git am如何处理行结尾(msysgit 1.7.4)?
难道我真的拿VIM和更改文件格式UNIX来DOS之前,我可以应用补丁?
编辑:甚至没有用VIM修改补丁文件有帮助:我想,set ff=dos一个:%s/^M//g会有所帮助,但事实并非如此!
在我看来,应用补丁应该会产生完全相同的内容,也会产生相同的提交哈希值,就像我从创建补丁的其他repo中提取的那样.我错了吗?
eck*_*kes 19
在玩了各种选项之后(core.autocrlf,core.eol)我发现使用了
git am --keep-cr
Run Code Online (Sandbox Code Playgroud)
诀窍(但会导致关于尾随空格的警告).
无需手动编辑补丁文件或其他污垢.
但是,(当然)散列是不同的,如nikai的答案中所描述的......感谢nikai指出我的哈希值.
在我的笔记本电脑,台式机的情况下,我想从笔记本电脑离线传送一些修改桌面电脑,但回购不应该偏离也不应同犯发生两次,当我申请桌面上的补丁,然后做一个git pull desktop从笔记本.
为此,我做了以下事情:
git am --keep-cr ...git pull desktop,这导致了每个提交由贴片介绍了有关情况出现两次(一次为原装笔记本犯,曾经为修补和桌面拉提交)master在笔记本的分支上),发出消息git rebase desktop/master导致No changes -- Patch already applied并启动原始笔记本提交替换为桌面提交Git 2.3.0(2015年2月)将提出另一个新选项:--transfer-encoding为了指定要使用的传输编码(quoted-printable,8bit,base64),而不是仅依赖于 --keep-cr.
见提交8d81408由保罗Bonzini( )bonzini:
git-send-email:添加--transfer-encoding选项该邮件列表线程应用补丁的细节问题时,以"
git am与CRLF行结束的仓库".
在线程的示例中,存储库源自"git-svn",因此无法core.eol在其上使用和朋友.现在,最好的选择是使用"
git am --keep-cr".
但是,当修补程序创建新文件时,修补程序应用程序进程将拒绝新文件,因为它找到"/dev/null\r"字符串而不是"/dev/null".问题是SMTP传输是CRLF不安全的.
通过电子邮件发送补丁与通过"dos2unix | unix2dos" 传递补丁相同.
新引入的CRLF通常是透明的,因为git-am剥离它们.该keepcr=true设置保留了它们,但它主要是偶然地git am工作,在具有混合LF和CRLF行结尾的存储库中具有" "工作流将是非常有问题的.对此的MIME解决方案是quoted-printable transfer enconding.
这不是我们想要默认启用的内容,因为它会使收到的电子邮件看起来很糟糕.
但是,它非常适合在存储库中存储CRLF行结尾的项目.quoted-printable的唯一缺点是,如果维护者使用"
git am --keep-cr" ,则引用可打印的补丁无法应用.
这是因为解码的补丁在该行的末尾将有两个回车符.
因此,也添加了对base64传输编码的支持,这使得收到的电子邮件无法在MUA(邮件用户代理)外部查看,但实际上只是有效.该补丁涵盖了所有基础,包括仍然生活在80年代后期的用户,还提供了一种7位内容传输编码,拒绝发送带有非ASCII字符的电子邮件.
最后,"8bit"将添加Content-Transfer-Encoding标头,但不执行任何操作.
git send-email的文档现在包括:
--transfer-encoding=(7bit|8bit|quoted-printable|base64)
Run Code Online (Sandbox Code Playgroud)
指定用于通过SMTP发送邮件的传输编码.
遇到非ASCII消息时,7位将失败.当存储库包含包含回车符的文件时,Quoted-printable可能很有用,但是使原始补丁电子邮件文件(从MUA保存)更难以手动检查.
base64更加傻瓜式,但也更加不透明.默认值是'
sendemail.transferEncoding'配置值; 如果未指定,git将使用8位而不添加Content-Transfer-Encoding标头.