git am/format-patch:行结尾的控制格式

eck*_*kes 12 git format-patch

我用三个提交创建了一个补丁

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和更改文件格式UNIXDOS之前,我可以应用补丁?


编辑:甚至没有用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从笔记本.

为此,我做了以下事情:

  1. 在桌面上,使用如上所述应用修补程序 git am --keep-cr ...
  2. 在笔记本电脑,到git pull desktop,这导致了每个提交由贴片介绍了有关情况出现两次(一次为原装笔记本犯,曾经为修补和桌面拉提交)
  3. 现在(master在笔记本的分支上),发出消息git rebase desktop/master导致No changes -- Patch already applied并启动原始笔记本提交替换为桌面提交


Von*_*onC 5

Git 2.3.0(2015年2月)将提出另一个新选项:--transfer-encoding为了指定要使用的传输编码(quoted-printable,8bit,base64),而不是仅依赖于 --keep-cr.

git send-email手册页.
git am手册页.

提交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标头.