ram*_*win 19 linux windows git git-index
我有一个由 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
Run Code Online (Sandbox Code Playgroud)
我猜 git 缓存存在一些问题。例如:windows 和linux 都使用该.git/index文件作为缓存文件,但是linux 系统中的git 无法识别.git/indexwindows 更改的内容。所以它只能刷新索引和替换.git/index文件,这使得下一个git status超级快,git status在windows下很慢(因为windows系统会再次刷新索引文件)。
我的猜测正确吗?如果是这样,我如何使用为不同系统设置索引文件?我该如何解决问题?
tor*_*rek 22
你在这里完全正确:
你在这里使用的东西,Git 不同地称之为index、staging area或cache,实际上包含缓存数据。
它包含的缓存数据是系统调用的结果。
Linux系统返回的系统调用数据与Windows系统返回的系统调用数据不同。
因此,操作系统切换使所有缓存数据完全无效。
...如何为不同的系统设置索引文件?
最好的办法是根本不要这样做。制作两个不同的工作树,或者甚至两个不同的存储库。但是,如果这比其他选择更痛苦,请尝试以下想法:
Git 使用的实际索引文件仅默认为 .git/index. 您可以通过设置为其他(相对或绝对)路径来指定不同的文件GIT_INDEX_FILE。因此,您可以拥有.git/index-linux和.git/index-windows,并GIT_INDEX_FILE根据您使用的任何操作系统进行设置。
一些 Git 命令使用临时索引。他们通过设置GIT_INDEX_FILE自己来做到这一点。如果他们之后取消设置,他们可能会.git/index在此时意外使用。因此,另一种选择是在切换操作系统时重命名 .git/index。保持 a .git/index-windowsand.git/index-linux和以前一样,但在使用.git/index时将使用中的任何一个重命名为,然后在切换到另一个系统之前将其重命名为。.git/index-name
同样,我不建议尝试这两种方法中的任何一种,但它们或多或少都可能奏效。
Ted*_*ham 12
这可能不适用于原始海报,但如果 Linux 在Windows Subsystem for Linux (WSL)下使用,那么git.exe即使在 Linux 端也可以使用快速修复。使用别名或其他东西使其无缝。例如:
alias git=git.exe
Run Code Online (Sandbox Code Playgroud)
bk2*_*204 11
正如 torek 提到的,您可能不想这样做。在操作系统之间共享存储库通常不是一个好主意。
但是,这是可能的,就像可以在 Windows 和适用于 Linux 的 Windows 子系统之间共享存储库一样。您可能想尝试设置core.checkStat为minimal,如果这还不够,设置core.trustctime为false。这导致索引中存储的信息量最少,这意味着数据将尽可能具有可移植性。
但是请注意,如果您的存储库具有符号链接,则您所做的任何事情都可能会阻止刷新。Linux 通常将符号链接的长度视为以字节为单位的长度,而 Windows 则认为它占用一个或多个磁盘块,因此操作系统之间的大小会不匹配。这是无法避免的,因为大小是索引中使用的无法禁用的属性之一。