代码之家  ›  专栏  ›  技术社区  ›  mcarton

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

  •  11
  • mcarton  · 技术社区  · 8 年前

    我主要在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)
    

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

    Linux git版本:2.11.0。

    Windows git版本:2.14.1。windows。1.

    1 回复  |  直到 8 年前
        1
  •  7
  •   torek    8 年前

    这里您看到的是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工作树必须位于自己的分支中,或者使用分离的头;分离头方法可能适合此目的,只需使用 git checkout --detach <branch> 有更新。