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

时间:2016-09-29 01:07:40

标签: git githooks

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

编辑:

我应该以不同的方式提出我的问题。无论如何,我刚刚碰到了这个:

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

提到“如果它是常规(SMB / CIFS)网络共享,它将在客户端上执行。”从本地存储库中执行git remote -v时,它会显示映射到origin的本地协议(file://),并且使用我的客户端上的Perl而不是Perl on来推送到网络共享上的远程数据库。服务器,已通过perl --version验证。所以我真正想问的是这个信息,如果它们是“服务器端”的钩子怎么会这样呢?他们不应该总是在服务器上运行吗?这是在Windows btw。

1 个答案:

答案 0 :(得分:1)

我现在明白这一点混乱的来源。显然“服务器端”挂钩在服务器上运行 - 但是如果你运行git push到一个URL为file://...的遥控器(或只是/some/path/to/repo之类的路径),并且在各种服务器上 - 如果是侧挂钩,让服务器打印其主机名或软件版本,或者其他什么,你会发现这些是你自己机器的软件版本等。

这里的技巧是当你处理本地路径时,你的Git充当客户端服务器,与自己交谈。即使您的本地文件系统是基于网络的,也是如此,只要Git本身将其视为本地文件系统即可。因此对于NFS,或CIFS / Samba,或者(如果你使用这样的东西)安德鲁文件系统挂载或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在这里是“客户端”,而过程28495是“服务器”。当然,两者都在一台主机/ VM /上。我在这里设置了远程me以指向file:///home/torek/tmp/t。)

相关问题