如何让 git 理解 Mac (CR) 行结尾

2023-11-30

由于某些原因,我的一个文件包含旧式 Mac 行结尾(在 OSX 上编辑后)。这些是“CR”(回车)字符,在中显示为 ^Mgit diff.

Git 不理解它们是行结束代码(真的有多难?)并将整个文件解释为一行。

我知道我可以将文件转换为 LF 或 CRLF 结尾,然后将它们提交回来,但是由于 git 自动将我的 Windows (CRLF) 行结尾转换为 LF,我希望它也能处理 CR 行结尾。

有没有办法让 git 将 CR 解释为行结尾?


TL;DR

创建过滤器驱动程序 plus.gitattributes: 创建一个污迹过滤器运行的tr '\n' '\r' and a 清洁过滤器运行的tr '\r' '\n',并将有问题的文件标记为使用此过滤器。使用仅 LF 行结尾将文件存储在 Git 中。 (过滤器驱动程序定义在.git/config or $HOME/.gitconfig文件和文件的名称或名称模式进入.gitattributes.)

Long

正如您所看到的,Git 强烈喜欢以换行符结尾的行。 (它可以使用换行符分隔的行,其中最后一行缺少终止符,但这意味着添加一行会导致对前一个最终行的更改,因为它现在有一个换行符终止符,而新的最终行丢失换行符。)这对于单个快照并不重要,但对于生成有用的差异很重要。

现代 MacOS 和其他操作系统一样使用换行符。只有古老的向后兼容格式才有仅 CR 的行结尾。参见,例如,此 SuperUser Stack Exchange 网站发布.

Git 没有built in用于转换为此类行结尾或从此类行结尾转换的过滤器。 gitdoes然而,有一个通用机制用于更改工作树文件。

请记住,当 Git 在快照中存储任何文件时,该文件由 Git 所谓的斑点对象,它以一种特殊的、压缩的(有时是高度压缩的)、仅限 Git 的形式在内部存储。这个表格没有任何用处butGit,因此当您以有用的形式获取文件时 - 通过git checkout例如,Git 将它们扩展为计算机常用的形式。同时,每当您获取像这样的普通文件并将其转换为仅限 Git 的形式时,Git 都会将该文件压缩为其仅限 Git 的形式。每当你将文件复制回 Git 时就会发生这种情况index using git add.

当工作树就位时,每个文件的索引副本都存在,就像提交的副本一样。索引副本采用相同的仅 Git 格式。这里的主要区别是提交的副本can't被改变,但是索引副本can被改变。跑步git commit拍摄索引中所有内容的快照就在那时,并将其作为新提交的新快照。因此该指数的作用为下一次提交会发生什么。使用git checkout,您复制一些现有的提交into索引,并让 Git 将其扩展到工作树中;然后使用git add,您可以有选择地用已更改的工作树文件的压缩版本替换特定索引副本。

这种在索引和工作树之间的复制是进行 Windows 风格的 LF 到 CRLF 转换的理想点,反之亦然,所以这就是 Git 所做的事情。如果你有一些other要执行的转换,不是直接内置于 Git 中,这是您告诉 Git 执行此操作的地方。

涂抹并清洁过滤器

A 污迹过滤器是 Git 将文件从压缩索引副本转换为工作树副本时应用的一种。在这里,如果您选择将换行符替换为 CRLF Windows 样式的行结束符或分隔符,Git 有一个内部转换器可以执行此操作:eol=crlf. A 清洁过滤器Got 是在将文件从未压缩的工作树副本转换为压缩索引副本时应用的;又是在这里,eol=crlf指示 Git 进行向后转换。

如果您想用仅 CR 替换换行符,则必须发明自己的转换器。假设您调用整个流程convert-cr:

*.csv   filter=convert-cr

(代替*.csv eol=crlf)。这条线进入.gitattributes(这是一个可提交的文件,您应该提交它)。

现在您必须定义convert-cr筛选。这是一个 Git 配置文件,在这里我们发现了一个小缺陷:配置文件不可提交。这是一个安全问题:Git 将在此处运行任意命令,如果我可以提交此文件并克隆它,您将运行命令I指定,而没有机会先审查它们。所以你必须把它放入你的.git/config你自己,或者进入你的全局配置(git config --global --edit例如):

[filter "convert-cr"]
    clean = tr '\r' '\n'
    smudge = tr '\n' '\r'

现在每当 Git 转换时from仅限 Git 的格式,它会将换行符转换为 CR,并且每当 Git 转换时to仅 Git 格式,它将把 CR 转换为换行符。

这对现有存储的文件没有帮助

您今天拥有的任何现有快照\r在它们内部,永远以这种方式存储。 Git 永远不会更改任何现有的存储文件!存储的数据宝贵且不可侵犯。您对此无能为力。嗯,有almost什么都没有:您可以完全丢弃这些提交,转而使用新的和改进的提交。但这是相当痛苦的:每次提交都会记住它的parent提交,因此如果您替换存储库中的早期提交,则必须替换every孩子、孙子等等,以便他们都记住这个新的提交序列。 (git filter-branch做这项工作。)

但是,您可以指导 Git 如何diff现有提交中的特定文件,也使用.gitattributes and 差异驱动程序。有多种方法可以做到这一点,但最简单的方法是定义一个textconv属性,它将“二进制”文件(例如其存储版本可能仅包含 CR 字符的文件)转换为文本(面向行,即基于换行符)文件。这里使用的 textconv 过滤器与污迹过滤器完全相同。

有关更多详细信息,请参阅gitattributes 文档.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何让 git 理解 Mac (CR) 行结尾 的相关文章

随机推荐

  • 如何减少 YOLOv3 文件中的类数量?

    我正在使用 YOLOv3 来检测视频中的汽车 我下载了代码中使用的三个文件coco names yolov3 cfg and yolov3 weights它们针对 80 种不同类别的待检测物体进行了训练 该代码可以运行 但速度非常慢 每帧需
  • 如何使用 YouTube Android 播放器 API 播放 YouTube 直播?

    我已经成功使用 YouTubePlayer 播放 YouTube 视频 但是 当我尝试使用 YouTubePlayer 播放直播时 没有任何反应 API支持直播吗 如果是这样 我该怎么做 播放普通 YouTube 视频和直播视频没有区别 我
  • (psycopg2.DataError) 整数输入语法无效:从 csv 文件导入?

    我的csv文件中的数据是这样的 081299289X China Dolls Lisa See 2014 0345498127 Starter for Ten David Nicholls 2003 0061053716 Imajica C
  • python np.nan 和 '==' & 'is' [重复]

    这个问题在这里已经有答案了 当我检查 Python 操作数的相等性和同一性时 例如a b a我明白了 a b gt True a is b gt True 我明白了 那么 为什么我得到 np nan 的 diff 结果 a np nan b
  • IsDate 函数返回意外结果

    怎么会IsDate 13 50 回报True but IsDate 12 25 2010 回报False 我最近被这个小 功能 绊倒了 想提高人们对围绕该功能的一些问题的认识 IsDateVB 和 VBA 中的函数 简单的案例 正如你所期望
  • 从具有级别的列表构造一棵树

    我有一些数据 Pythonlist of dicts 看起来像 value A level 0 value B level 1 value C level 2 value D level 1 value E level 2 value F
  • Apache Poi:从 HSSF 转换为 SS?

    除了我制作工作簿的部分之外 我已将 HSSF 中的所有旧代码转换为 SS 旧代码 HSSFWorkbook wb new HSSFWorkbook new FileInputStream 文件 新的非工作代码 工作簿 wb2 新工作簿 新F
  • Django, sorl-缩略图裁剪图片头像

    伙计们 我想知道 sorl thumbnail 是否有任何选项可以从下到上裁剪 我有一个垃圾问题 在某些图片中 sorl thumbnail 正在裁剪图片中人物的头部 Thanks 我刚刚发布了新版本的 sorl thumbnail 3 2
  • Java中如何检查字符串中是否包含日期?

    如何检查字符串是否包含以下形式的日期 美国东部时间 2012 年 1 月 15 日星期日晚上 7 36 我正在处理的数据包含大量字符串 但我正在寻找的字符串类型包含 2 或 3 个单词的名称和日期 我正在检查日期来识别这些类型的字符串 我已
  • 使用 Pandas 修改 Excel 文件,布局变化最小

    我已经读过Pandas 可以读取和修改单个 Excel 文件工作表 选项卡 而不修改文件的其余部分吗 但在这里我的问题是针对下文提到的布局的 如何使用 Pandas 打开 Excel 文件 进行一些修改 然后将其保存回来 1 不删除有一个F
  • PhoneGap - 使 Android 功能成为可选

    我希望为我的 Android 应用程序设置一些不需要的设置 以便 Google 的 Play 商店会识别它对平板电脑也有用 我需要将这两行添加到我的 AndroidManifest xml 中
  • QGraphicsView 使用鼠标滚轮在鼠标位置下放大和缩小

    我有一个应用程序QGraphicsView窗口位于屏幕中间 我希望能够使用鼠标滚轮滚动来放大和缩小 目前我已经重新实现了QGraphicsView并覆盖鼠标滚动功能 以便它不会滚动图像 就像默认情况下一样 void MyQGraphicsV
  • 如何通过相应的 WCF 绑定使用 MSMQ over http?

    我们通过 MSMQ 在代理和服务器之间建立了单向连接 我正在尝试通过 http 将其移动到 MSMQ 现在 MSMQ 与服务器端的 IIS 集成 我确保在安装 MSMQ 时检查相应的选项 但我很困惑下一步该做什么 我的意思是 端点地址没有表
  • Freemarker 迭代 hashmap 键

    Freemarker 有两种集合数据类型 列表和哈希图 有没有一种方法可以像我们处理列表一样迭代哈希图键 因此 如果我有一个带有数据的变量 可以这样说 user name user email email protected homepag
  • 在编译时更改字符串宏

    我正在开发一个必须在不同机器上工作的独特客户端 在每台机器中 服务器都在不同的 IP 地址中运行 但该地址是已知的 我不想每次运行时都告诉客户端哪个是IP 所以我想在编译时告诉它 问题是当编译时g DHOSTNAME 127 0 0 1 也
  • 循环中的 Cout 不按定义逐个打印字符

    我最近在大学开始学习 C 并决定在家进一步学习 我的想法是制作一个程序 给定一段文本 它会逐个字符地打印出这样的文本 中间有一个小的延迟 如本视频所示 超热聊天 我尝试使用一个简单的过程重新创建它 void typer string tex
  • 错误:函数预部署错误:命令以非零退出代码终止254

    我正在使用Mac 我尝试从该线程中阅读并实现解决方案 但它不起作用 以非零退出代码开始的 Firebase 部署错误 项目路径中的空格 将代码部署到 firebase 时出现错误 我正在部署功能运行命令 npm prefix RESOURC
  • RxJS - 如何在不使用间隔的情况下增量增加延迟时间?

    我想逐步增加延迟 const source from 839283 1123123 63527 4412454 note this is random const spread source pipe concatMap value gt
  • UIImageView 在自定义 UICollectionViewCell 中返回 nil

    上周我问了一个类似的问题 但我想我已经将问题范围缩小到更具体地出了什么问题 正在加载自定义单元格 并且当我使用时看起来可以正确调用collectionView dequeReusableCellWithIdentifier MenuCell
  • 如何让 git 理解 Mac (CR) 行结尾

    由于某些原因 我的一个文件包含旧式 Mac 行结尾 在 OSX 上编辑后 这些是 CR 回车 字符 在中显示为 Mgit diff Git 不理解它们是行结束代码 真的有多难 并将整个文件解释为一行 我知道我可以将文件转换为 LF 或 CR