24

我有一个 Windows 和 linux 共享的磁盘分区(格式:NTFS)。它包含一个 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/indexwindows更改的内容。所以只能刷新索引和替换.git/index文件,这使得nextgit status超级快,git status在windows下很慢(因为windows系统会再次刷新索引文件)。

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

4

4 回答 4

29

你在这里完全正确:

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

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

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

因此,操作系统切换会使所有缓存数据完全无效。

...我如何使用为不同的系统设置索引文件?

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

Git 使用的实际索引文件仅默认为 .git/index. 您可以通过设置其他(相对或绝对)路径来指定不同的文件。GIT_INDEX_FILE因此,您可以拥有.git/index-linuxand .git/index-windows,并GIT_INDEX_FILE根据您使用的任何操作系统进行设置。

一些 Git 命令使用临时索引。他们通过设置GIT_INDEX_FILE自己来做到这一点。如果他们之后取消设置,他们可能会.git/index在此时意外使用。因此,另一种选择是在切换操作系统时重命名 .git/index.git/index-windows和以前一样保留 a .git/index-linux,但在使用.git/index时将正在使用的那个重命名为,然后在切换到另一个系统之前将其重命名为。.git/index-name

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

于 2019-11-27T02:03:05.230 回答
10

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

但是,它是可能的,就像可以在 Windows 和 Windows 子系统 for Linux 之间共享一个 repo 一样。您可能想尝试设置core.checkStatminimal,如果这还不够,则设置core.trustctimefalse。这导致存储在索引中的信息量最少,这意味着数据将尽可能便携。

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

于 2019-11-27T05:08:24.860 回答
3

自动换行设置解决了我在这个讨论中的问题。现在我可以通过 linux、windows 甚至通过便携式操作系统来控制存储库。

git config --global core.autocrlf true 
于 2021-04-20T20:12:37.670 回答
1

这可能不适用于原始海报,但如果在 Windows 子系统 (WSL) 下使用 Linux,那么即使在 Linux 端也可以使用 git.exe 快速修复。使用别名或其他东西使其无缝。

于 2021-08-24T21:37:42.013 回答