【问题标题】:Share Git repository between Windows VM and Linux host在 Windows VM 和 Linux 主机之间共享 Git 存储库
【发布时间】:2018-04-11 14:29:01
【问题描述】:

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

【问题讨论】:

  • 我想,在那段时间里,你的 VirtualBox 正在你的系统之间同步数据。
  • “我不能改变获取has的方式”...好吧,好吧,但是哈希是如何获得的?
  • 我建议使用 github 或 bitbucket 之类的第三方来托管您的存储库,并在每个上分别克隆存储库。 git status 将立即生效,因为它只需要转到本地磁盘。通过共享/网络存储共享单个存储库并不是 git 的真正预期用例。
  • @MaxFriederichs 我已经有一个 Git 服务器,但我在问题中明确表示,每次我需要运行测试时提交和拉取会产生更大的开销。
  • @MarkAdelsberger 我已经编辑了问题。

标签: git shared-directory


【解决方案1】:

您在这里看到的是 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 &lt;branch&gt; 进行更新。

【讨论】:

  • 我不知道可以更改索引路径。我现在在 Windows 上将 GIT_INDEX_FILE 设置为 .git/index-win,这似乎很有魅力。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多