git 在 windows 和 linux 之间切换后强制刷新索引

git forces refresh index after switching between windows and linux

我有一个磁盘分区(格式:NTFS)由 windows 和 linux 共享。它包含一个 git 存储库(约 6.7G)。
如果我 仅使用 windows 仅使用 linux 来操作 git 存储库,则一切正常。
但是每次我切换系统。 git status 命令将刷新索引,大约需要 1 分钟。在我 运行 宁 git status 之后,如果我再次在同一系统中 运行 git status。只需不到 1 秒的时间。这是结果

# Just after switch from windows
[#5#wangx@manjaro:duishang_design] git status  # this command takes more than 60s
Refresh index: 100% (2751/2751), done.
On branch master
nothing to commit, working tree clean

[#10#wangx@manjaro:duishang_design] git status  # this time the command takes less than 1s
On branch master
nothing to commit, working tree clean

[#11#wangx@manjaro:duishang_design] git status  # this time the command takes less than 1s
On branch master
nothing to commit, working tree clean

我想 git 缓存有问题。例如:windows和linux都使用.git/index文件作为缓存文件,但是linux系统中的git无法识别.git/index 由 windows 更改。所以它只能刷新索引并替换.git/index文件,这使得下一个git status超级快而windows中的git status非常慢(因为windows系统会重新刷新索引文件)。

我的猜测是否正确?如果是这样,我如何为不同的系统设置索引文件?我该如何解决这个问题?

你在这里完全正确:

  • 你在这里使用的东西,Git 不同地称为 indexstaging area,或 缓存,实际上包含缓存数据。

  • 它包含的缓存数据是系统调用的结果。

  • Linux系统返回的系统调用数据与Windows系统返回的系统调用数据不同

因此,OS 开关使所有缓存数据完全无效。

... how can I use set the index file for different system?

你最好的选择是根本不要这样做。创建两个不同的工作树,或者甚至两个不同的存储库。但是,如果这比其他选择更痛苦,请尝试这些想法:

Git 使用的实际索引文件仅 默认为 .git/index。您可以通过将 GIT_INDEX_FILE 设置为其他(相对或绝对)路径来指定 不同的 文件。因此,您可以使用 .git/index-linux.git/index-windows,并根据您使用的 OS 设置 GIT_INDEX_FILE

一些Git命令使用临时索引。他们通过自己设置 GIT_INDEX_FILE 来做到这一点。如果他们 un-之后设置它,他们可能会在此时意外使用 .git/index。所以另一种选择是 rename .git/index 在切换 OSes 时让开。和以前一样保留一个.git/index-windows.git/index-linux,但是在使用时将正在使用的一个重命名为.git/index,然后将其重命名为.git/index- <em>名称</em> 切换到其他系统之前。

同样,我不建议尝试这两种方法中的任何一种,但它们或多或少可能会奏效。

正如 torek 所提到的,您可能不想这样做。在操作系统之间共享存储库通常不是一个好主意。

但是,有可能,就像可以在 Windows 和 Windows 子系统之间共享 Linux 的存储库一样。您可能想尝试将 core.checkStat 设置为 minimal,如果这还不够,请将 core.trustctime 设置为 false。这导致索引中存储的信息量最少,这意味着数据将尽可能便携。

但是请注意,如果您的存储库具有符号链接,则很可能您所做的任何事情都不会阻止刷新。 Linux 通常认为符号链接的长度是它的字节长度,而 Windows 认为它占用一个或多个磁盘块,因此操作系统之间的大小会不匹配。这是无法避免的,因为大小是索引中使用的无法禁用的属性之一。

自动行结束设置解决了我在 this discussion 中的问题。现在我可以通过 linux、windows 甚至通过便携式 OS.

控制存储库
git config --global core.autocrlf true 

这可能不适用于原始发帖人,但如果 Linux 在 windows 子系统 (WSL) 下使用,那么快速修复是使用 git.exe,即使在 Linux边。使用别名或其他方式使其无缝。