在Windows VM和Linux主机之间共享Git存储库

mca*_*ton 6 git shared-directory

我主要在Linux上工作,但我也有一个Windows VM,主要用于在Windows上运行单元测试.

在Linux中,我有一个Git存储库,可以使用VirtualBox共享文件夹从Windows VM访问.我不在Windows上使用Git,除了我们的构建系统,它记录当前的Git哈希以将其包含在可执行文件中(运行git describe --always --dirty).

现在,每次我在Linux或Windows上使用Git,然后再在另一个系统上使用Git,它需要一段时间.例如:

  Linux$ git status
  Linux$ git status # fast (<1s)
Windows$ git status # takes a few dozen seconds
Windows$ git status # fast (<1s)
  Linux$ git status # takes a few seconds
  Linux$ git status # fast (<1s)
Run Code Online (Sandbox Code Playgroud)

我有什么办法可以防止这种情况发生吗?我可以在Windows上关闭Git功能,因为它只需要获取哈希值.但是我无法改变获取此哈希的方式,因为这在构建系统中很深.我也不希望在Linux和Windows上有单独的存储库并且彼此提交/推送,因为这会导致更大的开销.

Linux git版本:2.11.0.

Windows git版本:2.14.1.windows.1.

tor*_*rek 5

您在这里看到的是 Git 的索引在用作缓存时的有效性。

连同它所做的所有其他事情,Git 的索引充当有关工作树的数据缓存,以加速文件系统操作——嗯,真的,如果可能的话,跳过文件系统操作。它通过记录有关文件的统计信息(以及秘密地记录目录,即使 Git 实际上并不存储目录)来实现这一点。此缓存仅在多个条件成立时才有效。如果没有,Git 必须在工作树上执行昂贵的文件系统操作,正如您所见,这在 Linux 上需要几秒钟的时间,而在 Windows 上则更慢。

共享文件夹违反了缓存假设。特别是,在该指数中的项目之一是路径的工作树和路径是Linux系统内部不同的比它在Windows VM。(无论这两个系统是如何托管的,这通常都是正确的。)

有几种明显的方法可以解决这个问题:

  1. 不要共享工作树。这可能是最好的方法。
  2. 不允许其中一个系统更新索引(通过将其设置为只读——这可能有点棘手)。
  3. 在其中一个系统使用一个单独的索引:默认的指数是$GIT_DIR/index哪里$GIT_DIR是从环境还是从默认git rev-parse --git-dir,但设置GIT_INDEX_FILE的路径名称将其覆盖。

我建议使用方法 1 的原因是它内置于 Git,如果您的 Git 至少是 2.5 版,则使用git worktree add. 请注意,每个 Git 工作树必须在其自己的分支中,或者使用分离的 HEAD;分离的 HEAD 方法可能适用于此目的,只需使用git checkout --detach <branch>那里进行更新。

  • 我不知道可以更改索引路径。我现在已经在 Windows 上将 `GIT_INDEX_FILE` 设置为 `.git/index-win`,这似乎很有魅力。 (2认同)