【问题标题】:how to avoid git-apply changing line endings如何避免 git-apply 更改行尾
【发布时间】:2011-09-12 14:39:55
【问题描述】:

我有一个带有 core.eol=crlfcore.autocrlf=truecore.safecrlf=true 的 git 存储库。

当我从另一个crlf repo 和我的repo 应用补丁时,受影响文件的所有行结尾都更改为lf。目前我正在应用补丁:

git apply --ignore-whitespace mychanges.patch

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

我目前的工作是在文件上运行unix2dos。有没有更好的方法让 apply 符合我的 eol 设置?

【问题讨论】:

    标签: git newline eol


    【解决方案1】:

    检查 Git 2.14.x/2.15(2015 年第三季度)问题是否仍然存在

    参见commit c24f3ab(2017 年 8 月 19 日)和 commit 2fea9de(2017 年 8 月 13 日)Torsten Bögershausen (tboegi)
    (由 Junio C Hamano -- gitster -- 合并于 commit a17483f,2017 年 8 月 27 日)支持>

    apply: 使用 CRLF 提交的文件应该往返 diff 并应用

    当使用 CRLF 提交文件但现在 .gitattributes 说“* text=auto”(或 core.autocrlftrue)时,以下内容不会 往返,git apply 失败:

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

    在应用补丁之前,工作树中的文件被转换 转换成索引格式(清除过滤器、CRLF 转换……)。
    这里,当使用 CRLF 提交时,不应转换行尾。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 如果我可以有自己的方式,我也会与lf 合作,但我正在使用我的 git 存储库与我组织的 svn crlf 要求行尾。当我git svn dcommit 时,我不想将lf eols 推送到数据库。我在使用crlf(我在Windows 上)的其他任何地方都没有发现任何问题,git diffvim 不会显示^M,除非存在不一致。
      • 但这是以在 git 和 svn 中以不同方式存储行尾为代价的。如果你这样做,你就会有摩擦。这就是为什么我建议将 autocrlf 设置为 false,然后只处理通过 core.whitespace 显示差异的方式。
      【解决方案3】:

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

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

      【讨论】:

      • 我希望这对我有用,但由于某种原因它没有。相反,我成功地使用了:git apply --whitespace=fix mychanges.patch奖励: 更少的命令!
      • @blong,你应该提交一个答案。
      猜你喜欢
      • 2011-03-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-11
      • 1970-01-01
      • 1970-01-01
      • 2011-04-24
      相关资源
      最近更新 更多