如何让 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) 行结尾 的相关文章

  • 按时间顺序将多个文件夹提交到 git 中

    我有数百个网站备份 每个文件夹一个 我想将它们放入 git 存储库中 每个备份作为一个版本 这些变化主要涉及图像文件和每天 2 个数据库备份 大小约为 25 GB 并且不断增加 有没有办法告诉 git 获取其中一个文件夹并将其提交到存储库中
  • 未能将一些参考推送至 [email protected]

    当我尝试推送到 Heroku 存储库时收到此错误 我已经设置了autocrlf false在gitconfig中 但这个问题仍然存在 我也尝试过这个解决方案here https stackoverflow com questions 566
  • Git post-receive - 如何检查推送的分支是否与主分支合并

    在我们的团队中 我们通常将所有任务推送到单独的分支中 然后发布经理审查这些分支并将它们合并到 主 分支中 有时团队成员忘记将他们的分支与主分支合并 在推送之前 所以我想做的是 在用户推送后输出一条消息 请与主分支合并 我想我需要检查一些内容
  • 执行 git Push 时出现“diff.renamelimit 变量”警告

    我将本地提交推送到远程 git 服务器并收到以下警告消息 remote warning only found copies from modified paths due to too many files remote warning y
  • 清理远程 Git 分支

    我已经将 SVN 存储库移至 Git 可能由于多次克隆 我现在只剩下一堆看起来像这样的分支 BranchA origin BranchA remotes BranchA remotes origin BranchA remotes orig
  • 无法捆绑适用于 Mac 的 Java 应用程序 1.8

    我正在尝试将我的 Java 应用程序导出到 Mac 该应用程序基于编译器合规级别 1 7 我尝试了不同的方法来捆绑应用程序 1 日食 我可以用来在 Eclipse 上导出的最新 JVM 版本是 1 6 2 马文 看来Maven上也存在同样的
  • Xcode 4.6.3 中 Dropbox API 的代码设计失败:“代码对象根本没有签名”

    我有一个通过 Mac App Store 分发的 OS X 应用程序 最近更新到 Xcode 4 6 3 当我现在运行常规构建时 我收到 Command usr bin codesign failed with exit code 1 Us
  • 为别名命令添加“git help”?

    我已经实现了一个 Git 命令并使用 git 别名将其连接到 Git 但是有没有办法连接 Git 帮助 我在 Windows 上运行 如果我发出git help mycmd我收到一个弹出窗口 告诉我 Git 找不到 git mycmnd h
  • Android Studio 无法在 Mac OSX (Mavericks) 上加载 JVM

    我正在尝试在我的 Mac 上设置 Android Studio 它运行的是 OSX 10 9 1 Mavericks 我已经安装了最新的 JDK 在撰写本文时为 1 7 update 45 并且安装了 Android Studio 我使用
  • 如何使用 git --word-diff 显示空格差异?

    为了说明问题 参见diff https github com nim lang Nim commit 47c7fd037ed28b7de3d120b003d059d30e18f128 diff split diff 8af935b2312d
  • 更改 macOS 应用程序中打开窗口中的文档

    我正在为 macOS 编写一个基于文档的应用程序 我正在尝试编写一项功能来更改当前窗口中的活动文档 以便能够循环浏览文件夹中的下一个 上一个文档 就像使用图像浏览器应用程序一样 我应该调用什么命令来在当前窗口中打开不同的文档 文档表明 op
  • 如何恢复已删除的远程分支

    我们的远程主分支被删除 我有主存储库的本地副本 但它已经过时了 我可以通过将最后一个已知的提交哈希值插入 URL 来查看 github 中的分支 但未能成功恢复它 我尝试了几个步骤来恢复它 git reset hard 16deddc05c
  • 如何获取 git 存储库中所有文件的计数?

    如何获取 git 存储库中当前所有文件的计数 您可以使用以下命令获取 git 存储库中所有跟踪文件的计数 git ls files wc l 命令分解 The git ls files命令本身打印出存储库中所有跟踪文件的列表 每行一个 Th
  • 如何解决 xcode 一直编译所有内容的问题?

    我已经开始使用 XCode 它似乎可以工作 嗯 大部分 烦人的是它每次都会编译所有源文件 甚至是那些没有更改的文件 我正在掌握 openframeworks 每次都浪费时间编译 openframeworks 源文件 尽管它们没有改变 以下是
  • NSUserNotificationCenter.defaultUserNotificationCenter() 使用 PyInstaller 返回 None

    我正在尝试将通知发送到通知中心 Mac OSX 我正在使用 PyObjC 绑定来使用我们的 python 应用程序中的 cocoa api 我正在使用以下代码片段 import Foundation import objc NSUserNo
  • Docker 容器与主机网络的网络性能非常慢

    我遇到了 Docker 容器和主机网络之间网络性能缓慢的问题 我在 Docker 论坛上提出了这个问题 但到目前为止还没有收到答案 Problem 设置 同一本地网络上的两台 Mac 第一个运行 MQTT 代理 mosquitto 第二个运
  • Mac OS X 上的 /proc/self/cmdline / GetCommandLine 等效项是什么?

    如何在不使用 argc argv 的情况下访问 Mac OS X 上的命令行 在 Linux 上 我会简单地阅读 proc self cmdline or use GetCommandLine在 Windows 上 但我找不到 Mac OS
  • 删除 Xcode 项目的源代码控制

    我在 Xcode 项目上使用源代码控制已经有一段时间了 但现在我不想使用源代码控制 如何从 Xcode 中的项目中删除源代码控制 有三种方法 方法 1 将禁用所有项目的源代码管理 方法 2 将删除所有项目的单个存储库的链接 方法 3 将删除
  • 使用Java开发跨平台,不同平台字体缩放不同

    我正在为我的大学制作一些软件 需要一个 GUI 在它的第一个版本中 我让它使用系统外观 因此它看起来像 Linux Mac Windows 中的本机应用程序 我发现这很麻烦 因为我必须根据操作系统使所有 JLabel 具有不同的大小 无论分
  • 结帐时出现 Git 错误:“致命:引用不是树”

    当我决定弄清楚为什么我正在从事的项目如此重要时 这一切就开始了 我运行了以下脚本 git rev list objects all git cat file batch check objecttype objectname objects

随机推荐

  • 如何减少 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