windows - 如何在通过文件 ://protocol? 指定的 Remote 上正确设置 Hook

标签 windows git hook git-post-receive

假设我有一个上游仓库(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/

相关文章:

sql - 如何使用 BAT 文件运行脚本?

c++ - EnumDesktopWindows (C++) 大约需要 30 分钟才能在 Windows 10 上找到所需的打开窗口

c++ - GET_X_LPARAM 给出负值

winapi - Windows 资源管理器不接收 WM_DESTROY。如何检测用户何时关闭资源管理器窗口?

delphi - 为什么从服务安装时我的钩子(Hook) DLL 不起作用?

c++ - 限制连接 BSTR 的参数类型

windows - IntelliJ 快捷方式上一个/下一个插入位置窗口

git - 如何处理分支 "test"

git - 如何在git中获取倒数第二个提交哈希

git - 如何获取Git命令的运行时间?