假设我有一个上游仓库(origin
)是用
git remote add origin file:////upstream.host/repo.git
repo.git
实际上是一个 Windows 共享文件夹,我和我的开发同事在其中分配了读/写访问权限。
现在,我想在 upstream.host
上设置一个 post-receive
Hook ,通知 Trac关于 automatic ticket updating 的最新推送修订.基本上,这是通过调用 upstream.host
上的可执行文件来完成的,该可执行文件在该处的数据库中执行一些操作。
但是,我发现由于某种原因 Hook 不起作用。
所以我设置了 Hook 以将她所做的一切打印到 D:/temp/post-receive.log
并发出 git push
以触发 Hook 。
当我查看 upstream.host
上的 D:/temp
时,没有创建日志文件。
然后又想到了我的另一个问题:https://superuser.com/questions/974337/when-i-run-a-git-hook-in-a-repo-on-a-network-share-which-binaries-are-used .
实际上,当我机器的二进制文件用于执行 Hook 时,可能还会使用我机器的路径。我查看了 D:/temp
,瞧瞧,这里有 post-receive.log
。
我追踪 pwd
到日志文件,它不是 D:/repos/repo.git
(我所期望的)但实际上是 //upstream .host/repo.git
。显然,整个 Hook 是在推送者机器的上下文中执行的,而不是在 repo 机器 (upstream.host
) 的上下文中执行的。
这对我来说不是问题,因为我拥有对远程机器的管理员访问权限,并且可以使用管理共享来让我的 Hook 继续运行(即 \\upstream.host\D$\repos\repo.git
等)。但这对我的同事来说是一个问题,因为他们是普通用户,没有根。
如何正确设置我的 post-receive
Hook ,使其按预期工作?
如何在不使用我机器上的任何东西的情况下强制我的钩子(Hook)完全在远程机器上运行?
我真的必须实现托管我的存储库的真实服务器吗?还是有其他不需要服务器的方式?
最佳答案
一个post-receive
在托管存储库的机器上接收到数据后运行 Hook 。
现在“托管存储库”的机器不是实际packed-refs
所在的文件服务器和其他git数据库文件存储。 (这个文件服务器可以是任何东西,从冗余的基于云的存储设备到任何旧的支持 NAS 的“网络磁盘”)。
相反,它是运行“git 前端”(即,实际与数据库 交互的 git 命令)的机器。
现在您正在使用“网络共享”来托管您的(远程)git 存储库。对于您的计算机(客户端),这只是另一个磁盘设备(就像您的软盘),您的客户端 上的 git 会愉快地将数据库文件存储在那里,并运行任何钩子(Hook)。但这是您的计算机,因为它被告知在本地运行远程 - 仅仅是因为 file://
协议(protocol)确实意味着“本地”。
顺便说一句,您的 Remote 名为 upstream.host
没有意义:此名称仅供您使用以跟踪多个 Remote ,但它可以称为 thursday.next
相反。
所以没有办法在文件服务器上运行任何恰好存储一些文件名的脚本pack-refs
和类似的。
如果你想有一个git 服务器 来为你运行钩子(Hook),你必须首先有一个git 服务器。更糟糕的是:如果你想让 machineX 上的 git 服务器在 machineX 上运行脚本,你必须先在 machineX 上安装一个 git 服务器。
好消息:无需“实现真实服务器”。只需安装一个预先存在的。您会在 Git Book 中找到相关文档, 但对于初学者来说,基本上有 git
就足够了(用于与数据库交互)和 sshd
(用于通过网络进行安全通信;并在适当时调用 git
)。
最后:我真的很高兴您需要在远程端上运行软件(例如服务器)以在那里执行代码。试想一下,如果将一些 html 文件复制到您的 USB 磁盘会突然凭空生成一个 Web 服务器,这意味着什么。没想到 w32-virusses 在我的 linux NAS 上快乐地繁殖......
关于windows - 如何在通过文件 ://protocol? 指定的 Remote 上正确设置 Hook ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32945359/