Git如何从UNC路径获取更改?

时间:2011-05-03 19:46:40

标签: windows git

我在Windows PC上的共享文件夹中有一个Git存储库,我使用UNC路径访问该文件夹,例如

git clone //server/share/MyRepo.git

当我从家中通过VPN获取此存储库中的更改时,非常需要很长时间才能运行git-upload-pack.exe。我意识到没有服务器(如此),我的本地PC正在运行所有可执行文件。

git-upload-pack.exe的名称告诉我,我的本地PC正在从远程文件共享中读取文件,以便将它们上传到某处,但这本身就是自己的,这没有任何意义。这反过来让我认为fetch远不及它可能的表现。这就像本地机器正在做所有工作来减少要传输的数据,但要做到这一点,它必须传输所有数据。

有人能说明这是如何运作的吗?如果没有通过SSH或远程端的任何东西运行真正的Git服务器,或者是不必要地来回传输文件,性能是否尽可能好?

2 个答案:

答案 0 :(得分:1)

它认为它就像本地文件系统。

通过SSH可以选择git:

  1. HTTP [S](git-http-backend)
  2. 纯粹的git-daemon。

答案 1 :(得分:1)

使用git 2.1(2014年8月),这个获取速度应该快得多:最近将一个旧的2012修复程序集成到git中。

commit 76e7c8a

(theoleblond)

compat/poll:睡眠1毫秒以避免忙碌等待

  

SwitchToThread()仅将当前时间片的其余部分泄露给当前进程中的另一个线程。因此,如果提供文件decscriptor的线程我们正在进行轮询,那么我们就会忙着等待。

     

我玩了很多。在尝试了一些更复杂的方案之后,我发现最有效的方法是在迭代之间只睡1毫秒。虽然时间很短,但它仍然可以完全消除繁忙的等待条件,而不会伤害性能。

     

代码使用SleepEx(1, TRUE)来睡觉   请参阅this page,以便更好地讨论为什么这比调用SwitchToThread更好,这是之前使用过的:

     

请注意,调用SleepEx(0, TRUE) 解决忙等待。

     

最引人注目的案例是在单CPU机器上使用大型仓库测试UNC共享时。
  没有修复,花了4分15秒,修复它只需要1:08
!我认为这是因为git-upload-pack忙碌的等待让CPU远离了正在进行实际工作的git进程。
  使用多进程,时间差别不大,但仍然浪费了大量的CPU时间,这可能是需要做其他事情的服务器的杀手。