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

标签 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)

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

Linux git 版本:2.11.0。

Windows git 版本:2.14.1.windows.1。

最佳答案

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

连同它所做的所有其他事情,Git 的索引充当有关工作树的数据缓存以加速文件系统操作——嗯,真的,跳过文件系统操作,如果可能的。它通过记录有关文件(以及 secret 的目录,即使 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>在那里更新。

关于git - 在 Windows VM 和 Linux 主机之间共享 Git 存储库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49777766/

相关文章:

java - 监视共享文件夹的更改并拉取到数据库

windows - Ansible - 从 Windows 远程共享获取文件

xcode - 如何使用 Xcode 删除 git 存储库中的文件或文件夹?

android - 在 Android Studio 中使用 Git 将本地分支与远程分支 merge

java - 使用 GIT 的 IDEA 新 gradle spring boot 项目。正确的创建顺序是什么?

git - 为什么我的 `remotes/origin/HEAD -> origin/master` 输出中有一个 `git branch -l -a` 条目?

git - 跟踪发布、分支或标签?

angular - ENOENT : no such file or directory, 重命名

compiler-errors - Visual Studio 2013无法打开共享项目

c# - 如何使用 C# 在远程 Windows 计算机上创建共享文件夹?