gpt4 book ai didi

规范化后的 Git 行尾

转载 作者:太空狗 更新时间:2023-10-29 13:55:51 29 4
gpt4 key购买 nike

这个行尾问题让我抓狂...

背景:过去,我使用的是 core.autocrlf 设置,但我发现我遇到了不同的存储库表现不佳的问题(我在 Windows 上工作,我有一些需要 LF 结尾的存储库和一些需要 CRLF 结尾的存储库)。所以我试图摆脱它并在每个存储库中使用 .gitattributes (我希望 Git 闭嘴并让我管理行尾!)。所以我现在有 core.autocrlf=false 和一个 .gitattributes 对于我正在处理的 Visual Studio 项目,它看起来像这样:

# Don't do any end of line normalization.
* -text

# Always treat these files as binary. Not strictly necessary, but can't hurt.
*.png binary
*.gif binary
*.jpg binary
*.jpeg binary
*.dll binary
*.doc binary
*.docx binary
*.xls binary
*.xlsx binary
*.pdf binary

我已将存储库中的所有文件强制为以 unix2dos 结尾的 CRLF,并确认它们在工作目录中具有正确的行结尾,并将它们全部 checkin 。是的,我遵循了此处的建议 Trying to fix line-endings with git filter-branch, but having no luck

这几乎是完美的。

问题 每当我更改文件时,git 都会报告它在更改的行上有行尾差异,例如,如果原始行是

string s;

修改后的行是

string sucks;

git diff 显示变化为

string sucks;^M

看起来 Git 认为 repo 中的文件仍然有 LF 结尾(因为它们在过去被规范化了?)。 ^M 会导致大量视觉噪音,我不确定这是否是其他任何问题的征兆。我不明白为什么 Git 会报告差异,因为我已经在上一次提交中 checkin 了所有以 CRLF 结尾的文件,实际上是在这次提交之前的提交。

那么,为什么我会得到这些“虚假”差异,我该如何摆脱它们呢?

最佳答案

哇哦!我想我找到了答案。本站http://lostechies.com/keithdahlby/2011/04/06/windows-git-tip-hide-carriage-return-in-diff/建议做

git config [--global] core.whitespace cr-at-eol

这确实关闭了“git diff”。当然,最好的解决方案是在 .gitattributes 文件中执行等效操作,以便它与存储库保持一致并且不依赖于用户的设置。

.gitattributes 的最终设置

我花了一些时间在 Linux 和 Windows 上试验 repos 以及具有 Unix 和 Windows 行尾的文件,我相信如果你只给你的 git repo 一个 .包含两行的 gitattributes 文件:

* -text
* whitespace=cr-at-eol

第一行阻止 git 执行任何行结束规范化,第二行停止 git-diff 在行尾突出显示 CR 字符。我能找到的唯一缺点是,如果将文件从 DOS 转换为 Unix,反之亦然:git-diff 将显示文件已更改,但不会突出显示原因,而只是显示每一行删除然后添加。我可以接受这个,因为它是一个非常罕见的手术(或者应该是)。

以上将行尾管理的负担放在了提交者身上。这是应该的,我不相信我的 VCS 工具应该尝试变魔术,成千上万的网页和关于 git 处理行尾的问题证明他们在这里做出了错误的决定。

变化

如果将第一行替换为

* eol=lf

然后文件在工作目录中将始终以 LF 结尾。这对于必须跨 Unix 和 Windows 工作的存储库非常方便,例如“.dotfiles”。同样,eol=crlf 将强制使用 Windows 风格的行结尾。 警告 这也会将 CRLF 转换为二进制文件!在 how to config git repo so that all files are stored with line-ending LF ( not CFLF ) ? 查看我的评论所以你还需要使用文件路径或告诉 git 哪些文件是二进制的。 https://help.github.com/articles/dealing-with-line-endings/

方便的别名

以下两个 git 别名提供了一种将存储库中的所有文本文件从 DOS 转换为 Unix 或反之的快速方法。他们明确排除了对 .git 文件夹的任何处理。我找不到从命令行定义它们的方法,因此编辑 .gitconfig 并在 [alias] 部分添加以下两行:

godos = !find . -path ./.git -prune -o -type f -exec unix2dos {} "\\;"
gounix = !find . -path ./.git -prune -o -type f -exec dos2unix {} "\\;"

然后您可以在存储库的根目录中执行 git godosgit gounix 以将所有文本文件结尾设置为一个或另一个。 注意以上仅适用于当前分支中的文件。我还没有找到一种方法来转换每个分支中的每个文件。

引用资料

gitattributes 手册页:https://www.kernel.org/pub/software/scm/git/docs/gitattributes.html

gitconfig 手册页(关于 cr-at-eol 的讨论):https://www.kernel.org/pub/software/scm/git/docs/git-config.html

查找的 Git 别名:`find -exec` in git alias

关于规范化后的 Git 行尾,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24577629/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com