`git` 显示克隆后更改的文件,无需任何其他操作

2023-12-08

git clone [email protected]:erocarrera/pydot (35a8d858b)在 Debian 中git config core.autocrlf input shows:

modified:   test/graphs/b545.dot
modified:   test/graphs/b993.dot
modified:   test/graphs/cairo.dot

这些文件具有 CRLF 行结尾,例如:

$ file test/graphs/cairo.dot
test/graphs/cairo.dot: UTF-8 Unicode text, with CRLF line terminators

The .gitattributes file contains:

*.py eol=lf
*.dot eol=lf
*.txt eol=lf
*.md eol=lf
*.yml eol=lf

*.png binary
*.ps binary

改变core.autocrlf对这些文件的状态没有影响。删除.gitattributes也没有效果。更改这些文件dos2unix不会改变他们的状态(如预期),并返回unix2dos与 没有什么区别diff与较旧的副本相比。文件权限看起来没有变化ls -lsa。另外,据我所知,这些文件具有统一的行结尾vi -b(因此不应该是这样的情况unix2dos or dos2unix从混合行结尾转换为统一行结尾,这可以解释这种奇怪的行为)。我在用着git版本 2.11.0。

什么是git认为有改变吗?

有点相关:

  1. 即使内容相同,Git 状态也会显示文件已更改
  2. git clone 之后直接显示为已修改的文件
  3. 克隆一个 git 存储库,它已经有一个肮脏的工作目录...Whaaaaa?

在多次讨论的搜索过程中,我没有找到解释这种行为的答案。这个问题源于pydot # 163.

更详细地说:

git status

On branch master
Your branch is up-to-date with 'origin/master'.
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

    modified:   test/graphs/b545.dot
    modified:   test/graphs/b993.dot
    modified:   test/graphs/cairo.dot

no changes added to commit (use "git add" and/or "git commit -a")

git diff test/graphs/b993.dot

warning: CRLF will be replaced by LF in test/graphs/b993.dot.
The file will have its original line endings in your working directory.
diff --git a/test/graphs/b993.dot b/test/graphs/b993.dot
index e87e112..8aa0872 100644
--- a/test/graphs/b993.dot
+++ b/test/graphs/b993.dot
@@ -1,10 +1,10 @@
-diGraph G{
-graph [charset="utf8"]
-1[label="Umlaut"];
-2[label="ü"];
-3[label="ä"];
-4[label="ö"];
-1->2;
-1->3;
-1->4;
-}
+diGraph G{
+graph [charset="utf8"]
+1[label="Umlaut"];
+2[label="ü"];
+3[label="ä"];
+4[label="ö"];
+1->2;
+1->3;
+1->4;
+}

UPDATE:

出于好奇,我提交了其中一个文件,转储git log -1 -p > diff, and vi -b diff表明git归一化

  1 commit 2021d6adc1bc8978fa08d729b3f4d565f9b89651
  2 Author:
  3 Date:
  4 
  5     DRAFT: experiment to see what changed
  6 
  7 diff --git a/test/graphs/b545.dot b/test/graphs/b545.dot
  8 index ebd3e8f..2c33f91 100644
  9 --- a/test/graphs/b545.dot
 10 +++ b/test/graphs/b545.dot
 11 @@ -1,9 +1,9 @@
 12 -digraph g {^M
 13 -^M
 14 -"N11" ^M
 15 -  [^M
 16 -  shape = record^M
 17 -  label = "<p0>WFSt|1571       as Ref: 1338    D"^M
 18 -]^M
 19 -N11ne -> N11:p0^M
 20 -}^M
 21 +digraph g {
 22 +
 23 +"N11" 
 24 +  [
 25 +  shape = record
 26 +  label = "<p0>WFSt|1571       as Ref: 1338    D"
 27 +]
 28 +N11ne -> N11:p0
 29 +}

其他奇怪的观察结果:git checkout克隆后任何这些文件都不会产生任何影响。After上面的提交,文件b545.dot工作目录中继续有 CLRF 行结尾。正在申请dos2unix其次是unix2dos没有做到git认为它已经改变了(而在提交之前它确实改变了,可能是因为坚定的文件有 CRLF 行结尾)。


这恰恰发生了because那些文件are致力于以 CRLF 结尾,但.gitattributes文件说以仅 LF 结尾提交它们。

Git 可以并且将会在两个地方进行 CRLF-vs-LF 转换:

  • 从索引提取到工作树期间。存储在提交或索引中的文件始终假定处于“干净”状态,但是当从索引中提取该文件到工作树时,Git 应该应用由.gitattributes例如,以“仅将 LF 更改为 CRLF”的形式,也可以以 Git 调用的形式污迹过滤器.

  • 将文件从工作树复制回索引期间。存储在工作树中的文件处于“弄脏”状态,因此此时,Git 应该应用任何“清理”转换:例如,将 CR-LF 更改为仅 LF,然后应用清洁过滤器.

请注意,这些转换有两个点can发生。这并不意味着他们will这两点都发生,只是这是两个可能的地方。作为.gitattributes文档说明,实际转换为:

  • eol=lf:索引上没有 -> 工作树;工作树上的 CR-LF 到 LF-only -> 索引
  • eol=crlf:索引 -> 工作树上仅 LF 到 CR-LF;工作树上没有 -> 索引

现在,实际位于存储库中、存储在提交中的文件是纯粹只读的。它可以never在该提交内进行更改。更准确地说,提交标识(通过哈希 ID)一棵树,该树标识(通过哈希 ID)具有任何内容的 Blob。这些哈希 ID 本身就是对象内容的加密校验和,因此它们自然都是只读的:如果我们尝试更改内容,我们得到的将是一个新的、不同的对象,具有新的、不同的哈希 ID。

Because git checkout实际上,通过将原始哈希 ID 从提交树复制到索引来工作,存储在索引中的文件版本必须与存储在提交中的文件版本相同。

因此,如果以某种方式——无论how— 提交的文件的形式与实际内容不一致.gitattributes指示 Git 执行的操作,无论事实如何,文件都会在工作树中变得“脏”you没有对他们做任何事!如果你要git add有问题的三个文件,这会将它们从工作树复制到索引,从而删除行尾的回车符。因此,他们在git status条款已修改但尚未提交。

去掉工作树版本中的回车符会使它们处于相同的状态:它们根据索引中的内容进行修改,因为git add现在将保持其仅 LF 行结尾不变,从而在索引中生成新的、不同的文件。

一个更有趣的问题是:他们是如何以错误的状态进入提交的?这不是我们可以回答的问题:只有那些做出这些承诺的人才能给出答案。我们只能推测。实现此目的的一种方法是添加并提交文件,而无需.gitattributes生效,然后设置.gitattributes生效,无需git add再次编辑文件。这样,CR-LF 结尾就会进入某人的索引,从而进入该用户的提交,即使.gitattributes file now说(但之前没有说过)任何new git add应该去掉回车符。

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

`git` 显示克隆后更改的文件,无需任何其他操作 的相关文章

  • 带有 git Remote 的 Gem 文件在 Heroku 推送上失败

    我的 gemfile 中有以下行 gem client side validations git gt email protected cdn cgi l email protection Dakuan client side valida
  • Android 存储库初始化失败

    我想我非常仔细地遵循该网站的说明 http source android com source downloading html http source android com source downloading html 但是当我尝试这
  • Git - 如何将整个目录恢复到特定提交(删除任何添加的文件)

    我想恢复 git 中的目录 恢复其中的所有文件 并删除自该提交以来添加的所有文件 进行结账似乎只能满足我的第一个要求 但不会删除任何文件 我想出了最简单的解决方案 git rm path to dir git checkout
  • git reflog 和 log 有什么区别?

    手册页说 log 显示提交日志 reflog 管理 reflog 信息 reflog 信息到底是什么 它有哪些日志没有的信息 日志看起来更详细 git log显示当前的 HEAD 及其祖先 也就是说 它打印提交 HEAD 指向的提交 然后打
  • 为什么 Git 无法将文件更改与修改后的父级/主控合并?

    我有一个文件 里面只有一行 我创建一个分支并向同一文件添加第二行 保存并提交到分支 我切换回主人 并向文件中添加不同的第二行 保存并提交给master 现在总共有 3 条独特的线路 如果我现在尝试将分支合并回主分支 则会遇到合并冲突 为什么
  • 如何减少 Bitbucket 上的 git repo 大小?

    我的问题摘要 在我向两个现有文件添加了几百个字节后 我在 Bitbucket 上的一个私人存储库的大小突然增加了一倍多 该存储库现在超过 2GB 这导致 Bitbucket 将其置于只读模式 因为它处于只读模式 所以我无法推送会减少存储库大
  • 将更改从一个分支复制到另一个分支

    我有一个分支名为BranchA from master 我有一些改变BranchA 我不会合并来自BranchA to master 现在我创建了另一个分支master named BranchB 我如何复制更改BranchA to Bra
  • 部分共享git仓库

    我是 git 新手 我想知道是否支持以下场景 如果支持的话如何支持 即用于设置和更新的 git 命令 可以从三个不同的地方获取存储库 本地 镜像 和 github mirror 完全镜像 local github 镜像 local 但 受版
  • Phonegap使用命令行工具添加插件

    我是phonegap的新手 我按照phonegap官方网站中定义的步骤使用命令行工具创建项目 nodejs 我成功创建项目并添加平台 但是 当我尝试添加插件时出现以下错误 命令 cordova plugin add https git wi
  • Git:如何修改服务器的提交?

    我已经在 EC2 上的 git 服务器上推送了一些提交 而不是在 github 上 如何修改 git 服务器上的这些提交 操作就像 删除提交 例如变基 更改提交消息 是否可以 非常感谢 你几乎可以通过用力推动来完成所有事情 将您的本地树更改
  • 如何创建名称中带有正斜杠的标签

    当我已经有了类似的标签时 有什么方法可以创建名称中带有正斜杠的 git 标签吗 假设我有 1 16 0 标签 并且我想创建 1 16 0 1 0 0 标签 git tag 1 16 0 1 0 0 error refs tags 1 16
  • 为 RHEL 6 安装/构建 git-svn

    我无权访问 RHEL6 存储库 那么在 RedHat Enterprise Linux 6 上构建和 或安装 git svn 工具的最佳方法是什么 通过卸载现有的 yum擦除git 并从源安装最新的来设法安装git和git svn 1 7
  • 在我的例子中,GIT 添加恢复(保留更改)

    在我对文件进行更改之后 我用git add FILE NAME 然后 我想将其恢复为未添加但与此同时保留更改 这个怎么做 git reset FILE NAME会做的 See the git reset manual https git s
  • 哪些 git hooks 适用于“git rebase --continue”?

    我正在尝试为我的组织构建一组 git hook 脚本 我想使用的一个脚本 仅用于我自己的多个项目 将是检查git rebase continue我的代码中没有留下任何冲突标记 lt lt lt lt lt or gt gt gt gt gt
  • 有没有办法导入/导出容器绑定脚本

    我有一个插件 它使用 appscripts gs 以及 html js 和 css 文件 目前我们所做的是我们有一个参考 Google 文档 其中有一个脚本项目包含所有这些源代码 但是除了手动复制和粘贴之外 没有办法在 GIT 中保留源代码
  • 如何更改 GitHub 上的文件模式?

    git add test file git commit m first commit create mode 100644 test file git push git update index add chmod x test file
  • git 错误:无法处理 https

    当我尝试使用 git clone 时https xxx https xxx我收到以下错误我不处理协议 https 有人可以帮我吗 完整消息 dementrock dementrock A8Se git 克隆https git innosta
  • git-lfs 中的多个文件版本

    我正在尝试估计 GitHub 上我的项目的存储要求 并对 git lfs 如何存储多个版本的文件有一些疑问 git lfs 是否存储多个版本的文件 如果是这样 对文件的每次更改都会导致复制整个文件 还是仅存储差异 所有版本都会计入 gith
  • 有没有一种干净的方法来处理两个以相同内容开头的原始 git 存储库?

    假设我有两个根据相同的初始内容创建的存储库 例如 如果我使用 git 来管理 etc apache2 中的 apache 配置文件 然后我运行git init分别在机器 A 和机器 B 上 此后 我对 machine b 进行了一些配置更改
  • 如何从 Git 存储库中删除选定的提交日志条目,同时保留其更改?

    我想从线性提交树中删除选定的提交日志条目 以便这些条目不会显示在提交日志中 我的提交树看起来像 R A B C D E HEAD 我想删除 B 和 C 条目 以便它们不会显示在提交日志中 但应保留从 A 到 D 的更改 也许通过引入单个提交

随机推荐

  • 在 Windows 上安装 Imagick for PHP 和 Apache

    到目前为止我已采取的步骤 我已经在我的Win7机器上安装了Imagick 并且它通过命令行安装并正常运行 我已经提取了 php imagick 3 1 2 5 6 ts vc11 x86 zip 的内容here进入我的 PHP ext 目录
  • 路由事件和依赖属性 .NET 包装器混淆

    我是 WPF 新手 对路由事件和依赖属性的包装语法感到困惑 我在许多来源上看到路由事件和依赖属性是这样包装的 Routed Event public event RoutedEventHandler Click add base AddHa
  • ElasticSearch 的 MasterService 计算集群状态花费的时间太长并抛出 ProcessClusterEventTimeoutException

    我们有一个每秒向 ES 集群添加数千个文档的应用程序 每次我们滚动正在写入的索引并开始写入新索引时 我们都会收到以下错误 这些错误不允许在大约 1 分钟内摄取文档 1 分钟后 一切都会恢复正常 直到我们再次滚动索引 WARN o e c s
  • 如何在流式查询中执行动态SQL?

    我正在使用 Spark 结构化流 并处理来自 Kafka 的消息 在某一时刻 我的结果表如下所示 其中数据集中的每一行都有一个 Spark SQL 查询 code triggerSql US SELECT FROM def UK SELEC
  • 如何/声明 google-play-services-component 时出错

    我正在使用 eclipse Java ADT 包 我正在尝试让 google 地图 api 正常工作 文档中引用的启动和运行 google 地图的方法是 设置 Google Play SDK gt 引用 eclipse 的库项目 http
  • 失败:元数据错误:java.lang.RuntimeException:无法实例化 org.apache.hadoop.hive.metastore.HiveMetaStoreClient

    当 HDFS 和 hive 实例运行时 我关闭了 HDFS 客户端 现在 当我重新登录 Hive 时 我无法执行任何 DDL 任务 例如 显示表 或 描述表名 等 它给了我如下错误 ERROR exec Task SessionState
  • 如何查询嵌套对象?

    我在使用嵌套对象表示法查询 mongoDB 时遇到问题 db messages find headers From email protected count 0 db messages find headers From email pr
  • 如何在 XMPP iOS 中获取消息已发送、已看到、失败和未读消息计数? (斯威夫特3.0)

    我正在开发聊天应用程序 因为我陷入了两种情况 1 如何获取消息状态 如已发送 已查看等 我做了以下事情 self xmppMessageDeliveryRecipts XMPPMessageDeliveryReceipts dispatch
  • 为什么这里会发生CMS(并发模式失败)?

    Operation System Red Hat Linux 4 8 CPU Info Intel R Xeon R CPU 5160 3 00GHz X 16 JDK version 1 5 0 16 JVM Parameter serv
  • Jquery 日期选择器 Chrome

    在使用 jQuery UI Datepicker 时 我们在 Google Chrome 中使用时遇到一个问题 当我们输入大于 12 的日期时 它不接受它作为有效日期 这是因为 chrome 认为日期格式是 mm dd yyyy 我们尝试通
  • 指针 - 减少内存消耗

    我一直在为 OpenGL 练习编写 Minecraft 复制品 我猜有很多 但是在编写了基本渲染 API 后 我注意到真正的 Minecraft 使用了lot或内存 大约 800MB 我完全理解为什么它必须记住所有块以及小怪以及生成器的地形
  • AS3 中的安全沙箱

    什么是安全沙箱违规 如何覆盖它 我正在 FlashDevelop 中制作一个项目 今天 它不会加载外部文件 即使以前加载过 它给出以下输出 安全沙箱违规 连接到 文件 C Documents 20and 20Settings Kevin P
  • 从浏览器控制台删除错误消息 (Angular HttpClient)

    HttpClient 有没有办法从浏览器控制台中删除错误消息 我当前的代码如下所示 getStuff stuffId string Observable
  • 如何从 UIPickerview 中删除选择行

    嗨我正在使用picker view 默认情况下选择第一行 我不想要这个选项 例如 我有 否 和 是 选项 如果我在pickerview中给出此选项 否 将在pickerview中被选择 附上屏幕截图 我不需要这个 我需要第一行为空 一旦用户
  • 如何从 Postman Rest 客户端发送 spring csrf 令牌?

    I have CSRF保护在Spring框架中 因此 在每个请求中 我从 ajax 调用的标头中发送 csrf 令牌 这是完美的工作 var token meta name csrf attr content var header meta
  • Android初学者padding和margin的区别[重复]

    这个问题在这里已经有答案了 我已经提出了有关SO的问题 还检查了一个答案 填充是边框内部 边框与实际视图内容之间的空间 请注意 填充完全围绕内容 顶部 底部 右侧和左侧都有填充 可以是独立的 边距是边框外部 边框与该视图旁边的其他元素之间的
  • Xcode 中的 Target 到底是什么?

    我一直想知道这些目标是怎么回事 这是什么一回事呢 那有什么意义呢 我从来不需要摆弄它们 但显然我可以 我为什么要这样 我能用它们做什么 他们的目的是什么 每个项目都可以构建多个可执行文件或库 或者调用 makefile 或 shell 脚本
  • C++11 中的逗号运算符(排序)

    标准中提到f a t 3 t 2 c 根据我的理解 这将是一个赋值表达式 后跟第二个运算符的表达式 但语法将其并列列出 表达 赋值表达式 表达式 赋值表达式 工作草案 编程标准 C语言 修订版 N4140 2014 年 11 月 有人好心向
  • 了解异步和等待

    我正在尝试学习 MVC5 的细节 但遇到了一些让我困惑的事情 在默认情况下带有个人身份验证的 MVC5 项目的 accountController 中 异步登录和注册方法中有这行代码 var result await UserManager
  • `git` 显示克隆后更改的文件,无需任何其他操作

    git clone email protected erocarrera pydot 35a8d858b 在 Debian 中git config core autocrlf input shows modified test graphs