我有一个磁盘分区(格式: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系统会再次刷新索引文件)。
我的猜测是否正确?如果正确,我如何为不同的系统设置索引文件?我如何解决这个问题?
5条答案
按热度按时间o0lyfsai1#
你在这里是完全正确的:
因此,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*
。同样,我不建议尝试这两种方法,但它们或多或少都有可能起作用。
jyztefdp2#
正如torek提到的,你可能不想这样做,在操作系统之间共享一个仓库通常不是一个好主意。
然而,这是可能的,就像在Windows和Windows Linux子系统之间共享存储库一样。您可能想尝试将
core.checkStat
设置为minimal
,如果这还不够,则将core.trustctime
设置为false
。这会导致存储在索引中的信息量最少,这意味着数据将尽可能可移植。但是,请注意,如果您的存储库具有符号链接,则很可能您所做的任何操作都不会阻止刷新。Linux通常认为符号链接的长度是其字节长度,而Windows认为它需要一个或多个磁盘块,因此操作系统之间的大小将不匹配。这是不可避免的,因为size是索引中使用的属性之一,不能禁用。
nx7onnlm3#
这可能不适用于最初的海报,但如果Linux是在**Windows Subsystem for Linux(WSL)**下使用的,那么快速解决方案是即使在Linux端也使用
git.exe
。使用别名或其他东西使其无缝。例如:xlpyo6sf4#
自动行结束设置解决了我的问题,因为在这个讨论。我指的是Windows,WSL2,便携式Linux操作系统,以及Linux,我已经设置和工作作为我的工作要求。我会更新的情况下,我面临的任何问题,而更喜欢这种方法更新代码库从不同的文件系统(NTFS或Linux文件系统)。
0wi1tuuw5#
在我的例子中,我只是不希望在docker容器中运行的命令(并调用
git status
来确定工作目录是否干净)在容器外部修改.git/index
,所以我让命令在运行GIT_INDEX_FILE=my_index_copy git status
之前临时复制.git/index
。在我的例子中,
.git/index
大约是1MB,这已经足够小了,即使复制该文件花费了额外的时间(特别是考虑到“Refresh index ...”需要多长时间),该命令仍然相当快。