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



我有一个由Windows和Linux共享的磁盘分区(格式:NTFS(。它包含一个 git 存储库(约 6.7 GB(。 如果我只使用 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超快,git statusWindows中非常慢(因为Windows系统会再次刷新索引文件(。

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

你在这里是完全正确的:

  • 你在这里使用的东西,Git 以不同的方式调用索引暂存区或缓存,实际上确实包含缓存数据。

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

  • 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像以前一样保留.git/index-windows.git/index-linux,但重命名正在使用的任何系统以在使用时.git/index,然后将其重命名为.git/index-name,然后再切换到另一个系统。

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

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

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

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

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

alias git=git.exe

自动行结束设置解决了我的问题,就像在这个讨论中一样。我指的是Windows,WSL2,Portable Linux OS和Linux,我已经设置并工作为我的工作要求。如果我遇到任何问题,我将进行更新,同时更喜欢这种方法从不同的文件系统(NTFS 或 Linux 文件系统(更新代码库。

git config --global core.autocrlf true 

就我而言,我只是不希望在 docker 容器中运行的命令(并调用git status以确定工作目录是否干净(在容器外修改.git/index,所以我让命令在运行GIT_INDEX_FILE=my_index_copy git status之前临时复制.git/index

就我而言,.git/index大约为 1 MB,这足够小,即使复制该文件所花费的额外时间,该命令仍然相当快(特别是考虑到"刷新索引......"采取(。

最新更新