如何在通过 file:// 协议指定的远程上正确设置挂钩?

How do I properly set up hooks on a remote that is specified via the file:// protocol?

假设我有一个上游仓库 (origin) 添加了

git remote add origin file:////upstream.host/repo.git

repo.git 实际上是一个 windows 共享文件夹,我和我的开发同事在其中分配了 r/w 访问权限。

现在,我想在 upstream.host 上设置一个 post-receive 挂钩,通知 Trac about freshly pushed revisions for automatic ticket updating。基本上,这是通过调用 upstream.host 上的可执行文件来完成的,该可执行文件在数据库中执行一些操作。

但是,我发现挂钩由于某种原因不起作用。 所以我设置了钩子来打印她对 D:/temp/post-receive.log 所做的一切,并发出 git push 以触发钩子。

当我查看 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。 实际上,当我机器的二进制文件用于执行挂钩时,可能还会使用我机器的 paths。我查看了 D:/temp,瞧瞧,这里有 post-receive.log.

我追踪 pwd 到日志文件,它不是 D:/repos/repo.git(我所期望的),但实际上是 //upstream.host/repo.git。显然整个钩子是在 pusher 机器的上下文中执行的,而不是在 repo 机器的上下文中执行的 (upstream.host).

这对 me 来说没问题,因为我有远程机器的管理员访问权限,可以使用管理共享来让我的钩子继续运行(即 \upstream.host\D$\repos\repo.git 等).但这 对我的同事来说是个问题,因为他们是普通用户,没有根。

如何正确设置我的 post-receive 挂钩,使其按预期工作?

如何强制我的挂钩完全 运行 在远程机器上而不使用我机器上的任何东西?

我真的必须实施托管我的存储库的真实服务器吗?还是有其他不需要服务器的方式?

一个 post-receive 挂钩 运行 在托管存储库的机器上接收数据后。

现在 "hosting the repository" 的机器 而不是 存储实际 packed-refs 和其他 git 数据库文件的文件服务器. (这个文件服务器可以是任何东西,从冗余的基于云的存储设备到任何支持 NAS 的旧设备 "network disk")。

而是 运行 执行 "git frontend" 的机器(即 git 命令实际与 数据库交互 ).

现在您正在使用 "network share" 来托管您的(远程)git 存储库。对于您的计算机(客户端),这只是另一个磁盘设备(就像您的软盘),客户端上的git将愉快地在那里存储数据库文件,以及 运行 任何挂钩。但这是你的电脑,因为它被告知 运行 本地 远程 - 只是因为 file:// 协议确实意味着 "local".

顺便说一句,您的遥控器名为 upstream.host 这一事实毫无意义:此名称仅用于 以跟踪多个遥控器,但它可能是取而代之的是 thursday.next

因此无法 运行 文件服务器上恰好存储一些文件名 pack-refs 和类似文件名的任何脚本。

如果你想要一个 git 服务器 到 运行 挂钩,你必须有一个 git 服务器 第一。更糟糕的是:如果您想要 machineX 上的 git 服务器到 machineX 上的 运行 脚本,您必须先在 machineX 上安装 git 服务器。

好消息:没有必要 "implement a real server"。只需安装一个预先存在的。您会在 Git Book 中找到有关该内容的文档,但对于初学者来说,拥有 git(用于与数据库交互)和 sshd(用于通过网络进行安全通信;以及用于适当时调用 git) 安装。

最后:我真的很高兴您需要 运行在 远程端 上安装软件(例如服务器)以在那里执行代码。试想一下,如果将一些 html 文件复制到您的 USB 磁盘会突然凭空生成一个 Web 服务器,这意味着什么。没想到 w32-virusses 在我的 linux NAS 上快乐地繁殖...