git在Windows和Linux之间切换后强制刷新索引

uyhoqukh  于 2023-03-31  发布在  Windows
关注(0)|答案(5)|浏览(215)

我有一个磁盘分区(格式:NTFS),包含一个git仓库(大约6.7GB)。如果我只使用Windows只使用Linux来操作git仓库,一切都没问题。但每次切换系统时,git status命令都会刷新索引,大约需要1分钟。如果我在同一个系统中再次运行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无法识别Windows更改的.git/index,因此只能刷新索引并替换.git/index文件,这使得下一个git status超级快,而Windows中的git status非常慢(因为Windows系统会再次刷新索引文件)。
我的猜测是否正确?如果正确,我如何为不同的系统设置索引文件?我如何解决这个问题?

o0lyfsai

o0lyfsai1#

你在这里是完全正确的:

  • 你在这里使用的东西,Git称之为 indexstaging area,或 cache,实际上包含缓存数据。
  • 它包含该高速缓存数据是系统调用的结果。
  • Linux系统返回的系统调用数据与Windows系统返回的系统调用数据不同。

因此,0 S切换完全使所有该高速缓存数据无效。
...我如何使用设置不同系统的索引文件?
你最好的选择是不要这样做。创建两个不同的工作树,或者甚至是两个不同的仓库。但是,如果这比其他选择更痛苦,请尝试以下想法:
Git实际使用的索引文件只是 * 默认为 * .git/index。您可以通过将GIT_INDEX_FILE设置为其他(相对或绝对)路径来指定一个 * 不同 * 的文件。因此,您可以使用.git/index-linux.git/index-windows,并根据您使用的操作系统设置GIT_INDEX_FILE
一些Git命令使用临时索引。他们通过自己设置GIT_INDEX_FILE来实现这一点。如果他们后来 un-set它,他们可能会在此时意外地使用.git/index。所以另一个选择是在切换操作系统时 rename.git/index。像以前一样保留.git/index-windows.git/index-linux,但在使用时将正在使用的系统重命名为.git/index,然后在切换到另一个系统之前将其重命名为.git/index-*name*
同样,我不建议尝试这两种方法,但它们或多或少都有可能起作用。

jyztefdp

jyztefdp2#

正如torek提到的,你可能不想这样做,在操作系统之间共享一个仓库通常不是一个好主意。
然而,这是可能的,就像在Windows和Windows Linux子系统之间共享存储库一样。您可能想尝试将core.checkStat设置为minimal,如果这还不够,则将core.trustctime设置为false。这会导致存储在索引中的信息量最少,这意味着数据将尽可能可移植。
但是,请注意,如果您的存储库具有符号链接,则很可能您所做的任何操作都不会阻止刷新。Linux通常认为符号链接的长度是其字节长度,而Windows认为它需要一个或多个磁盘块,因此操作系统之间的大小将不匹配。这是不可避免的,因为size是索引中使用的属性之一,不能禁用。

nx7onnlm

nx7onnlm3#

这可能不适用于最初的海报,但如果Linux是在**Windows Subsystem for Linux(WSL)**下使用的,那么快速解决方案是即使在Linux端也使用git.exe。使用别名或其他东西使其无缝。例如:

alias git=git.exe
xlpyo6sf

xlpyo6sf4#

自动行结束设置解决了我的问题,因为在这个讨论。我指的是Windows,WSL2,便携式Linux操作系统,以及Linux,我已经设置和工作作为我的工作要求。我会更新的情况下,我面临的任何问题,而更喜欢这种方法更新代码库从不同的文件系统(NTFS或Linux文件系统)。

git config --global core.autocrlf true
0wi1tuuw

0wi1tuuw5#

在我的例子中,我只是不希望在docker容器中运行的命令(并调用git status来确定工作目录是否干净)在容器外部修改.git/index,所以我让命令在运行GIT_INDEX_FILE=my_index_copy git status之前临时复制.git/index
在我的例子中,.git/index大约是1MB,这已经足够小了,即使复制该文件花费了额外的时间(特别是考虑到“Refresh index ...”需要多长时间),该命令仍然相当快。

相关问题