2016-09-29 108 views
-1

我知道脚本运行在远程回购站上,但脚本在哪个上下文中执行?它使用客户机的资源还是服务器机器的资源?或者它会根据客户端回购与远程回购进行通信的方式进行更改。我似乎无法在任何地方正式记录这些信息。Git服务器端挂钩有时不会在服务器端执行?

编辑:

我应该可能制定我的问题不同。反正,我只是跑成这样:

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时,它显示映射到原始地址的本地协议(文件://),并且推送到网络共享中的远程地址最终使用我的客户端上的Perl而不是服务器上的Perl验证与perl --version。所以我真正想问的就是这些信息,如果它们是“服务器端”的钩子,它怎么会这样呢?他们不应该总是在服务器上运行吗?这是在Windows btw上。

+3

服务器端挂接在服务器上运行否则它们会被称为客户端钩子:-))。它们在所有新对象已存在于存储库中之后运行*。在更新所有引用之前,预接收和更新钩子运行*,而在所有引用更新之后,接收后钩子运行*。 – torek

+1

啊:如果你推送一个*本地*文件系统('file:// foo'),那么这个“服务器”就是你自己的机器,即客户机是你的机器,但服务器也是如此,所以当“服务器“运行一些东西,这是你的客户做跑步。我不使用Windows,所以我不能说它可能认为哪些协议是“本地”(* protocol *是https://host.dom的'https:'或'ssh:'或'file:'部分。 ain/path'或'ssh:// host.dom.ain/path'或'file:// path' URL)。 (顺便说一句,我没有降低你原来的问题,因为我确实认为这些问题没有很好地记录下来。) – torek

+0

不用担心,在反思我最初提出的问题和阅读你的第一条评论之后,我意识到我的问题听起来有多愚蠢。无论如何,我更关心得到明确的答案。感谢您确认它没有很好的记录。嗯,我想标记你最近的评论作为答案,但我认为这是不可能的。 – solstice333

回答

1

我现在明白了这个特殊的混乱来自哪里。很显然,服务器端运行在服务器端,但是如果你运行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是“客户端”在这里,虽然进程28495是“服务器”,当然,它们都在单个主机/虚拟机/无论什么地方,我在此设置远程me指向file:///home/torek/tmp/t。)