如何避免git-apply更改行尾符

12

我已经设置了一个git仓库,其中包括core.eol=crlfcore.autocrlf=truecore.safecrlf=true

当我从另一个仓库应用补丁到我的仓库时,所有受影响的文件的行尾都会被更改为。目前我是这样应用补丁的:

git apply --ignore-whitespace mychanges.patch

(看来我必须使用--ignore-whitespace参数才能成功应用补丁。)

我目前的解决方法是在文件上运行unix2dos。有没有更好的方法让应用程序符合我的行尾设置?

3个回答

4

检查问题是否仍然存在于Git 2.14.x/2.15 (Q3 2015)

参见c24f3ab提交 (2017年8月19日)和2fea9de提交 (2017年8月13日),由Torsten Bögershausen (tboegi)进行了改进。
(由Junio C Hamano -- gitster --a17483f提交中合并,于2017年8月27日)

apply: 使用CRLF提交的文件应该循环差异和应用程序

当一个文件已经使用CRLF提交,但现在.gitattributes说"* text=auto"(或core.autocrlftrue),以下步骤不会循环,git apply失败:

printf "Added line\r\n" >>file &&
git diff >patch &&
git checkout -- . &&
git apply patch

在应用补丁之前,工作树中的文件会被转换为索引格式(清洗过滤器、CRLF 转换等)。
在使用 CRLF 提交时,行尾不应该被转换。

3

我不会允许我的源代码控制系统控制我的行尾。将自动crlf设置为false,通过将core.whitespace设置为cr-at-eol来显示没有烦人的^M的差异。现在diff输出会更易读。


如果我能自己选择,我也会使用lf工作,但是我正在使用我的git存储库与组织的svn一起工作,在其中需要将行结尾设置为crlf。当我执行git svn dcommit时,我不想将lf eols推送到数据库中。在其他任何地方使用crlf都没有发现任何问题(我在Windows上),只有在存在不一致性时,git diffvim才会显示^M - m0tive
但是这样做的代价是在 git 和 svn 中存储行结尾方式不同。如果你这么做,会产生一些不必要的障碍。这就是为什么我建议将 autocrlf 设置为 false,然后通过 core.whitespace 处理差异显示的方式。 - Adam Dymitruk

0

在一个干净的工作目录中尝试:

git apply mychanges.patch
git diff -w > mychangesnows.patch
git reset --hard
git apply mychangesnows.patch

6
我本希望这个方法对我奏效,但出于某些原因它并没有起作用。相反,我使用了git apply --whitespace=fix mychanges.patch取得了成功。额外福利: 命令更少! - blong
@blong,你应该提交一个答案。 - Timothy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接