gpt4 book ai didi

git - 如何在 git 上使用 CRLF 提交文件?

转载 作者:太空狗 更新时间:2023-10-29 14:42:57 24 4
gpt4 key购买 nike

我有一个包含 5 个已使用 CRLF 提交的文件的存储库。我不知道这是怎么发生的,但是如果我使用这个命令,它会打印出 5 个文件(数百个):

git grep -I --files-with-matches --perl-regexp '\r' HEAD

有谁知道如何重现这个问题?换句话说,会导致这种情况的一组git设置是什么?

最佳答案

在内部,Git 只存储原始数据。如果你运行 git hash-object -w你可以将任何你喜欢的 blob 数据推送到存储库中(尽管你随后需要附加一个标签,或者将 blob 添加到索引中以将其存储到新的提交中)。

正如我在对 What does "check out code" mean in git documentation for line endings? 的回答中指出的那样, Git 将在您运行 git add 时,对启用此类翻译的任何文件应用仅 CRLF 到 LF 的行尾翻译在那个文件上。结果是索引中文件的版本(或更准确地说,索引中的 blob 散列,表示存储库中的 blob 对象)具有仅 LF 行尾。

如果你运行 git add在该文件上:

  • 全局禁用翻译,或
  • 在该特定路径名上禁用翻译

然后 Git 不会 进行这些翻译,文件的索引版本有任何'\r'它在工作树版本中的字符。

.gitattributes 中的设置和/或 core.autocrlf控制是否启用翻译,如果启用,则执行哪些翻译。由于历史设置(从 Git 什么都不做的时候开始,到添加 Windows 支持的早期阶段,通过 Git 的各种中间版本,到当前相当复杂的 .gitattributes 方法),所有这些的规则都非常复杂。

In other words what is a set of git settings that can lead to this situation?

有很多不同的方法,但最简单的方法是写一个 .gitattributes文件只有:

* -text

或设置core.autocrlffalse (但请注意 .gitattributes 通常会覆盖 core.autocrlf )。现在 Git 会将所有文件视为二进制文件,在 git add 期间不进行“清理”在git checkout期间没有“弄脏” .工作树内容现在将逐字节匹配索引内容,但您自己或通过运行程序对工作树文件所做的任何更改除外。然后你可以 git add那些新文件到索引,它会逐字节复制它们;和每个新的 git commit你制作的将使用索引中的内容。

一旦您将您关心的特定文件的特定版本存储为永久且不可更改的提交,您就可以修改 .gitattributes包含您想要测试的任何其他设置,然后运行 ​​git checkout <commit> -- <path>使 Git 将文件从提交复制到索引,通过模糊过滤器复制到工作树中。您可以随意修改任何工作树文件,然后运行 ​​git add <path>通过清理过滤器运行文件以将其复制到索引中。这些过滤器将由您在 .gitattributes 中拥有的任何内容控制。 在您运行命令时,这样您就可以试验不同的属性而无需进行新的提交。

关于git - 如何在 git 上使用 CRLF 提交文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46695521/

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