- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
出于某些原因,我的一个文件包含旧样式的mac行结尾(在osx上编辑后)。这些是“CR”(回车)字符,在git diff
中显示为^m。
git不理解它们是行尾代码(真的有多难?)并将整个文件解释为一行。
我知道我可以将文件转换为lf或crlf结尾,然后将它们提交回去,但是由于git自动将我的windows(crlf)行结尾转换为lf,我希望它也能处理cr行结尾。
有没有办法让git将cr解释为行尾?
最佳答案
TL;博士
创建过滤器驱动程序加上:创建运行.gitattributes
的污迹过滤器和运行tr '\n' '\r'
的干净过滤器,并将有问题的文件标记为使用此过滤器。只使用lf行尾将文件存储在git中。(过滤器驱动程序在tr '\r' '\n'
或.git/config
文件中定义,文件的名称或名称模式进入$HOME/.gitconfig
)
长
如您所见,git非常喜欢以换行符结尾的行。(它可以处理换行分隔的行,其中最后一行缺少终止符,但这意味着添加一行将导致对前一个最后一行的更改,因为现在它有了换行终止符,而新的最后一行缺少换行终止符。)这与单个快照无关,但是对于产生有用的差异确实很重要。
现代的macos像其他人一样使用新线。只有古老的向后兼容格式才有仅限CR的行尾。参见,例如,this SuperUser Stack Exchange web site posting。
Git没有用于转换为或从这样的行尾的内置筛选器。然而,git确实有一个通用的机制来对工作树文件进行更改。
记住,当git在快照中存储任何文件时,该文件由git所称的blob对象表示,blob对象在内部以一种特殊的、压缩的(有时是高度压缩的)git-only形式存储。这个表单除了git之外对其他任何东西都没有用处,因此当您通过.gitattributes
获得有用表单中的文件时,例如git将它们扩展为您计算机的常用表单。同时,任何时候,当您获取像这样的普通文件并将其转换为git-only格式时,git都会将该文件压缩为git-only格式。每当您使用git checkout
将文件复制回git的索引时,都会发生这种情况。
每一个文件的索引拷贝都存在于工作树所在的位置,就像提交的副本一样。索引副本的格式与git-only格式相同。这里的关键区别在于提交的副本不能更改,但是索引副本可以更改。运行git add
将获取索引中此时的任何内容的快照,并使其成为新提交的新快照。因此,索引充当将进入下一次提交的内容。使用git commit
,将一些现有的提交复制到索引中,并将Git扩展到工作树中,然后使用git checkout
,用有更改的工作树文件的压缩版本选择性地替换特定索引副本。
在索引和工作树之间或从索引和工作树之间进行复制是进行windows样式lf到crlf转换的理想点,反之亦然,因此git就是在这里进行复制的。如果有其他转换要执行,而不是直接内置到git中,那么这就是告诉git执行转换的地方。
污渍和清洁过滤器
污迹过滤器是git在将文件从压缩索引副本转换为工作树副本时应用的过滤器。在这里,如果您选择用crlf windows风格的换行符或分隔符替换换行符,git有一个内部转换器可以做到这一点:git add
。一个干净的过滤器是git在将文件从未压缩的工作树副本转换为压缩索引副本时应用的过滤器;这里,eol=crlf
再次指示git进行反向转换。
如果你只想用CR替换换行符,你必须发明自己的转换器。假设您将整个过程称为:
*.csv filter=convert-cr
eol=crlf
)。这一行进入
convert-cr
(这是一个可提交的文件,您应该提交它)。
*.csv eol=crlf
过滤器。在git配置文件中,我们发现了一个小缺陷:配置文件不可提交。这是一个安全问题:git将在这里运行任意命令,如果我可以提交这个文件并克隆它,您将运行我指定的命令,而不必先检查它们。因此,您必须自己将其放入
.gitattributes
或全局配置中(例如
convert-cr
):
[filter "convert-cr"]
clean = tr '\r' '\n'
smudge = tr '\n' '\r'
.git/config
的快照,都会被永远保存下去。Git永远不会改变任何现有的存储文件!存储的数据是珍贵和不可侵犯的。你对此无能为力。好吧,几乎什么都没有:您可以完全抛出那些提交,生成新的和改进的提交,然后改用它们。但这是相当痛苦的:每个提交都会记住其父提交,因此如果替换存储库中的早期提交,则必须替换每个子提交、孙子提交等,以便它们都记住这一新的提交序列。(
git config --global --edit
完成此任务。)
\r
和DIFF驱动程序。有多种方法可以做到这一点,但最简单的方法是定义一个textconv属性,该属性将一个“二进制”文件(如存储版本可能只有CR字符的文件)转换为一个文本(面向行,即基于换行)文件。这里使用的textconv过滤器与smudge过滤器完全相同。
关于git - 如何使git理解Mac(CR)行尾,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52179708/
我正在尝试使用 opencsv 库将 SQL 结果集导出到以逗号分隔的 csv 文件。但是,当我将结果集传递给 writeAll 函数时,除了它生成的文件不会用新行分隔行并在记事本中打开时创建一个几乎
所以我有一个包含混合行结尾的文件。我只需要删除 linux 换行符 (LF),但只保留 Windows 行结尾 (RFLF)。任何可以做到这一点的快速 bash one liner? 最佳答案 如果要
所以我有一个包含混合行结尾的文件。我只需要删除 linux 换行符 (LF),但只保留 Windows 行结尾 (RFLF)。任何可以做到这一点的快速 bash one liner? 最佳答案 如果要
嗨,我正在尝试将行尾代码以 CSV 格式放入,以将其导入到 Excel 我尝试放入 \n、“\n”、\r、“\r”、\r\n、“\r\n”但对我没有任何作用我试图将其导入 excel 2013 我的
while ((client = accept(sock, (struct sockaddr *) &c, (socklen_t *) &clientlength)) > 0) { int h =
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎不是关于 a specific programming problem, a softwar
我正在从 LINUX(Debian) 读取一个 ASCII 文件到 Python CGI 脚本中,然后通过网页对其进行编辑然后保存, 如果我使用图形文本编辑器,编辑和未编辑的文件看起来是一样的,并且格
我有一个包含 n 列 y 行二进制值的文本文件。 我正在使用 getline 提取二进制值的每一行并将它们分配给 vector : 我正在使用 getline 提取文件的每一行,其中每一行由一系列由空
这个行尾问题让我抓狂... 背景:过去,我使用的是 core.autocrlf 设置,但我发现我遇到了不同的存储库表现不佳的问题(我在 Windows 上工作,我有一些需要 LF 结尾的存储库和一些需
我们有大量在不同平台上使用 CVS 的程序员。 我们有开发人员使用带 TortoiseCVS 的 Windows(它使用 cvsNT) 我们有开发者使用 ubuntu 8.04 我们的开发人员有两个盒
目前,我正在使用以下命令来更改 dos2unix 行尾,但这是针对 file-y 文件... sed -i 's/\r//' filename 有没有办法对目录中的所有文件运行此命令? 最佳答案 fo
我正在尝试将换行符 append 到已存在的文件中,但我尝试过的所有命令都导致仅 append 到第一行。我希望文件中的输出看起来像 行1 行2 private void addToFavToFil
我正在尝试将文件中的文本读入数组,然后将每个数组索引的内容输出到输出文件。我需要读取/存储数据直到它到达行尾,此时它应该重新开始读取/存储并重新使用数组进行临时存储,只输出到输出文件。 我不能使用 g
我在 PC 上安装了 Linux Mint,然后从 Bitbucket 克隆了 git 存储库以在其上运行。经过一些更改后,我确实在我的 PhpStorm ide 中提交了。在此提交期间,git 向我
我正在阅读有关 gcc 预处理的文档,我阅读了以下句子 ( here ): If the last line of any input file lacks an end-of-line marker
我们所有的开发人员都在 Windows 机器上工作,而构建是在 Linux 上完成的。 为了符合真正的方式,我们决定标准化行结尾并遵循场景 described on GitHub . 后来发现,有时从
出于某些原因,我的一个文件包含旧样式的mac行结尾(在osx上编辑后)。这些是“CR”(回车)字符,在git diff中显示为^m。 git不理解它们是行尾代码(真的有多难?)并将整个文件解释为一行。
为什么这段代码不起作用? b if b = true 错误:未定义局部变量或方法“b” 但是这样做: if b = true b end 他们不应该是一样的吗? 最佳答案 这是一个很好的问题。
我正在 checkout 具有Linux样式行结尾的文件(仅LF char)。当我在Windows中使用TortoiseSVN checkout 文件时,它将行尾转换为Windows样式(CR + L
我有一个 Windows 文本文件,其中包含一行(以 CRLF 结尾) aline 以下是几个命令的输出: [root@panel ~]# grep aline file.txt aline [roo
我是一名优秀的程序员,十分优秀!