git 在 windows 和 linux 之间切换后强制刷新索引
git forces refresh index after switching between windows and linux
我有一个磁盘分区(格式:NTFS)由 windows 和 linux 共享。它包含一个 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/index
由 windows 更改。所以它只能刷新索引并替换.git/index
文件,这使得下一个git status
超级快而windows中的git status
非常慢(因为windows系统会重新刷新索引文件)。
我的猜测是否正确?如果是这样,我如何为不同的系统设置索引文件?我该如何解决这个问题?
你在这里完全正确:
你在这里使用的东西,Git 不同地称为 index,staging area,或 缓存,实际上包含缓存数据。
它包含的缓存数据是系统调用的结果。
Linux系统返回的系统调用数据与Windows系统返回的系统调用数据不同。
因此,OS 开关使所有缓存数据完全无效。
... how can I use set the index file for different system?
你最好的选择是根本不要这样做。创建两个不同的工作树,或者甚至两个不同的存储库。但是,如果这比其他选择更痛苦,请尝试这些想法:
Git 使用的实际索引文件仅 默认为 .git/index
。您可以通过将 GIT_INDEX_FILE
设置为其他(相对或绝对)路径来指定 不同的 文件。因此,您可以使用 .git/index-linux
和 .git/index-windows
,并根据您使用的 OS 设置 GIT_INDEX_FILE
。
一些Git命令使用临时索引。他们通过自己设置 GIT_INDEX_FILE
来做到这一点。如果他们 un-之后设置它,他们可能会在此时意外使用 .git/index
。所以另一种选择是 rename .git/index
在切换 OSes 时让开。和以前一样保留一个.git/index-windows
和.git/index-linux
,但是在使用时将正在使用的一个重命名为.git/index
,然后将其重命名为.git/index- <em>名称</em>
切换到其他系统之前。
同样,我不建议尝试这两种方法中的任何一种,但它们或多或少可能会奏效。
正如 torek 所提到的,您可能不想这样做。在操作系统之间共享存储库通常不是一个好主意。
但是,有可能,就像可以在 Windows 和 Windows 子系统之间共享 Linux 的存储库一样。您可能想尝试将 core.checkStat
设置为 minimal
,如果这还不够,请将 core.trustctime
设置为 false
。这导致索引中存储的信息量最少,这意味着数据将尽可能便携。
但是请注意,如果您的存储库具有符号链接,则很可能您所做的任何事情都不会阻止刷新。 Linux 通常认为符号链接的长度是它的字节长度,而 Windows 认为它占用一个或多个磁盘块,因此操作系统之间的大小会不匹配。这是无法避免的,因为大小是索引中使用的无法禁用的属性之一。
自动行结束设置解决了我在 this discussion 中的问题。现在我可以通过 linux、windows 甚至通过便携式 OS.
控制存储库
git config --global core.autocrlf true
这可能不适用于原始发帖人,但如果 Linux 在 windows 子系统 (WSL) 下使用,那么快速修复是使用 git.exe,即使在 Linux边。使用别名或其他方式使其无缝。
我有一个磁盘分区(格式:NTFS)由 windows 和 linux 共享。它包含一个 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/index
由 windows 更改。所以它只能刷新索引并替换.git/index
文件,这使得下一个git status
超级快而windows中的git status
非常慢(因为windows系统会重新刷新索引文件)。
我的猜测是否正确?如果是这样,我如何为不同的系统设置索引文件?我该如何解决这个问题?
你在这里完全正确:
你在这里使用的东西,Git 不同地称为 index,staging area,或 缓存,实际上包含缓存数据。
它包含的缓存数据是系统调用的结果。
Linux系统返回的系统调用数据与Windows系统返回的系统调用数据不同。
因此,OS 开关使所有缓存数据完全无效。
... how can I use set the index file for different system?
你最好的选择是根本不要这样做。创建两个不同的工作树,或者甚至两个不同的存储库。但是,如果这比其他选择更痛苦,请尝试这些想法:
Git 使用的实际索引文件仅 默认为 .git/index
。您可以通过将 GIT_INDEX_FILE
设置为其他(相对或绝对)路径来指定 不同的 文件。因此,您可以使用 .git/index-linux
和 .git/index-windows
,并根据您使用的 OS 设置 GIT_INDEX_FILE
。
一些Git命令使用临时索引。他们通过自己设置 GIT_INDEX_FILE
来做到这一点。如果他们 un-之后设置它,他们可能会在此时意外使用 .git/index
。所以另一种选择是 rename .git/index
在切换 OSes 时让开。和以前一样保留一个.git/index-windows
和.git/index-linux
,但是在使用时将正在使用的一个重命名为.git/index
,然后将其重命名为.git/index- <em>名称</em>
切换到其他系统之前。
同样,我不建议尝试这两种方法中的任何一种,但它们或多或少可能会奏效。
正如 torek 所提到的,您可能不想这样做。在操作系统之间共享存储库通常不是一个好主意。
但是,有可能,就像可以在 Windows 和 Windows 子系统之间共享 Linux 的存储库一样。您可能想尝试将 core.checkStat
设置为 minimal
,如果这还不够,请将 core.trustctime
设置为 false
。这导致索引中存储的信息量最少,这意味着数据将尽可能便携。
但是请注意,如果您的存储库具有符号链接,则很可能您所做的任何事情都不会阻止刷新。 Linux 通常认为符号链接的长度是它的字节长度,而 Windows 认为它占用一个或多个磁盘块,因此操作系统之间的大小会不匹配。这是无法避免的,因为大小是索引中使用的无法禁用的属性之一。
自动行结束设置解决了我在 this discussion 中的问题。现在我可以通过 linux、windows 甚至通过便携式 OS.
控制存储库git config --global core.autocrlf true
这可能不适用于原始发帖人,但如果 Linux 在 windows 子系统 (WSL) 下使用,那么快速修复是使用 git.exe,即使在 Linux边。使用别名或其他方式使其无缝。