如何使用 "no changes" 更新本地存储库(行尾问题)

How do I update local repo with "no changes" (End of line issue)

我在一个团队中工作,除了我以外,每个人都在与 Mac 一起工作。我正在与 Windows 10 合作。 当我们意识到 CRLF 存在问题时,我克隆了远程团队存储库并使用它。 我更改了一个 git 选项,但现在我想再次更新存储库,但没有检测到任何更改,所以我不知道如何在所有存储库文件中使用正确的行结尾添加相同的文本。

提前致谢。

从字面上看,答案是删除所有文件,然后再次检查它们:

git rm -r -- .          # remove everything
git checkout HEAD -- .  # check everything out again

(旁注:此处的示例使用 --,名称 . 不需要它:仅当您的文件名看起来像分支名称或命令选项时才需要。一直使用它是一个好习惯,这样以后如果你想查看一个名为master的文件,你就自动写成git checkout -- master,不要不小心写成git checkout master ],这显然做了一些不同的事情。)

为什么需要先删除

这里有一个相当基本的 Git 烦恼,那就是 Git 试图提高效率。使用稍微短一些的命令,git checkout -- .,否则会做你想做的事,但是 Git 比较索引/暂存区/缓存1 中的内容在你的工作树中。 Git 使用索引的 "cache" 方面来加快速度,因为知道索引是 indexing/cacheing 工作树内容,因此如果索引和工作中没有任何变化-tree,每个文件的工作树版本自动正确匹配同一文件的索引版本。

索引的简短描述是它是你建立下一次提交的地方。这就是为什么它的名字是 staging area: you "stage" files into it, and when you make the commit, new commit uses whatever is on the stage to take the snapshot .它基本上 从不 是空的,虽然(除了我们上面的 git rm -r -- . 之后!):它开始持有 当前提交中的每个文件 .稍后,您将使用 git add 文件的索引版本替换为较新的版本。

Git 主要是关于提交,每次提交都存储每个文件的完整快照——不是自上一个版本以来的更改,只是整个文件,完整但压缩。提交中的副本采用这种特殊的压缩 Git 格式,并且 只读 因为它们 永远不会更改 。索引中的副本实际上,最初只是提交中副本的可替换版本,仅使用几十个字节存储,因为它确实 提交中的版本,直到用新版本覆盖索引副本。因此,索引副本也是特殊的 Gitty 格式,对大多数程序无用,仅对 Git 本身有用。

因此,您 工作 使用的是 工作树 中的文件,之所以这样命名是因为它是一个目录树(一个目录或包含子目录或子文件夹的文件夹,所有子文件夹都包含文件)您在其中工作。 Git 将提交中的文件提取到索引中,以便可以替换它们,然后将文件从索引中提取到工作树中,以便将它们扩展为有用的格式。

这是棘手的部分:当文件从索引到工作树,或从工作树到索引时,所有特殊的行尾处理都会发生。 所以git checkout -- <file>,它从索引中提取一个文件到工作树,在创建您将使用的文件时重新进行行尾处理。当将文件压缩为特殊的 Git-only 格式以将其填充到索引中时,您最终的 git add -- <file> 将撤消任何特殊的行尾处理。

但如上所述,Git 试图提高效率。 索引不仅包含文件副本,还包含有关 的信息 文件,以帮助 Git 快速找出索引中的副本与工作树中的副本之间是否存在任何差异。如果 Git 刚刚 签出 文件,Git 肯定 工作树中的副本 匹配索引中的副本。

如果您更改您的行尾处理,您更改方式 Git将从索引中提取文件到工作树。这意味着工作树中的副本不再有效。这正是烦恼的来源:Git 没有意识到工作树副本不再有效。它认为它仍然是完美匹配,并没有再次提取文件,以免浪费时间。

这会浪费 你的 时间,因为现在你必须做一些事情(比如删除文件)才能让 Git 做一些事情(重新提取文件)。 git rm -r -- . 从工作树 索引中删除 每个 文件,即在您当前的 directory/folder (.),然后 git checkout HEAD -- . 将当前提交中的每个此类文件重新提取到索引中,然后再提取到工作树中。这遵循新的行尾设置并以您想要的形式获取文件。

您只需要在最初设置 Git 时更改行尾设置时执行此操作。所以这是一种一次性交易——它并不像这个描述听起来那么痛苦。但我认为它 一个错误。


1这是同一事物的三个不同名称,反映了它的巨大重要性(它非常重要),或者它的多个不同的角色(它有多个角色),或者是因为使用的名字 "index" 太糟糕了。 :-)