Git 服务器端挂钩有时不在服务器端执行?

Git server-side hooks sometimes do not execute on the server side?

我知道该脚本在远程仓库中 运行,但是该脚本在哪个上下文中执行?它使用客户端机器的资源还是服务器机器的资源?或者它是否根据客户端仓库与远程仓库的通信方式而改变。我似乎无法在任何地方找到正式记录的此信息。

编辑:

我可能应该以不同的方式表述我的问题。无论如何,我只是 运行 进入这个:

https://superuser.com/questions/974337/when-i-run-a-git-hook-in-a-repo-on-a-network-share-which-binaries-are-used

其中提到 "If it’s a regular (SMB/CIFS) network share, it’s executed on the client." 在本地回购中执行 git remote -v 时,它显示映射到原点的本地协议 (file://),并推送到远程网络共享结束在我的客户端上使用 Perl,而不是在服务器上使用 Perl,通过 perl --version 验证。所以我真正想问的是给出这些信息,如果它们是 "server-side" 钩子,这怎么可能?无论如何,他们不应该总是 运行 在服务器上吗?这是在 Windows 顺便说一句。

我现在明白这种特别的困惑是从哪里来的了。显然 "server side" 在服务器上挂钩 运行——但是如果你 运行 git push 到一个 URL 是 file://... 的远程(或者只是像这样的路径/some/path/to/repo), 在各种服务器端的钩子里,让服务器打印它的主机名,或者软件版本什么的,你会发现那些是你自己机器的软件版本等等

这里的技巧是,当您处理本地路径时,您的 Git 充当客户端 服务器,与自己对话。即使您的本地文件系统是基于网络的,只要 Git 本身将其视为本地文件系统也是如此。因此对于 NFS,或者 CIFS/Samba,或者(如果你使用这样的东西)Andrew 文件系统挂载或者 Plan9 挂载或者 FUSE 等等,只要 Git 认为它只是你的一个普通的旧文件自己的机器,Git 自己完成所有服务器工作,所以这些仍然是本地的。

(事实上,如果您在 Unix/Linux 系统上 运行 ps,您会看到您的客户端已经分叉了一个 git receive-pack 进程:

remote:   PID  PPID TT  STAT      TIME COMMAND
[snip]
remote: 28494 27867  4  S+     0:00.06 git push me testbr
remote: 28495 28494  4  S+     0:00.07 git-receive-pack /home/torek/tmp/t
remote: 28499 28495  4  S+     0:00.01 /bin/sh hooks/pre-receive
remote: 28500 28499  4  R+     0:00.00 ps -O ppid

所以实际上,进程 28494 是这里的 "client",而进程 28495 是 "server"。当然,两者都在一个主机/虚拟机/任何东西上。我在这里设置了远程 me 指向 file:///home/torek/tmp/t。)