Git 服务器端挂钩有时不在服务器端执行?
Git server-side hooks sometimes do not execute on the server side?
我知道该脚本在远程仓库中 运行,但是该脚本在哪个上下文中执行?它使用客户端机器的资源还是服务器机器的资源?或者它是否根据客户端仓库与远程仓库的通信方式而改变。我似乎无法在任何地方找到正式记录的此信息。
编辑:
我可能应该以不同的方式表述我的问题。无论如何,我只是 运行 进入这个:
其中提到 "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
。)
我知道该脚本在远程仓库中 运行,但是该脚本在哪个上下文中执行?它使用客户端机器的资源还是服务器机器的资源?或者它是否根据客户端仓库与远程仓库的通信方式而改变。我似乎无法在任何地方找到正式记录的此信息。
编辑:
我可能应该以不同的方式表述我的问题。无论如何,我只是 运行 进入这个:
其中提到 "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
。)