繁体   English   中英

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-哪个二进制文件被使用

其中提到:“如果是常规(SMB / CIFS)网络共享,它将在客户端上执行。” 从本地存储库中执行git remote -v ,它会显示映射到原始协议的本地协议(file://),并通过我的客户端上的Perl而不是客户端上的Perl最终将网络共享推送到远程上服务器,通过perl --version验证。 因此,我真正想问的就是这些信息,如果它们是“服务器端”钩子,怎么办? 他们不应该始终在服务器上运行吗? 这是在Windows顺便说一句。

我现在知道这种特殊的混乱是从哪里来的。 显然,“服务器端”钩子在服务器上运行,但是如果您运行git push到URL为file://... (或只是诸如/some/path/to/repo类的路径)的远程服务器上,服务器端挂钩,让服务器打印其主机名或软件版本等,您会发现它们是您自己计算机的软件版本等。

这里的窍门是,当您处理本地路径时,您的Git既充当客户端充当服务器,与自己对话。 即使您的本地文件系统是基于网络的,也是如此,只要Git本身将其视为本地文件系统。 因此,对于NFS或CIFS / Samba,或者(如果使用此类东西)Andrew File System挂载或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 。)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM