Git - 接收后挂钩在远程 Windows 服务器上不起作用

2023-12-07

我正在尝试让 git post-receive hook 在 Windows 上工作。

我正在使用 Git 1.7.9 (Msysgit),并且在本地有一个存储库,在远程服务器上有一个裸存储库。我可以获取、提交、推送等。我已经设置了一个接收后挂钩,该挂钩应该将文件检出到工作文件夹中(部署过程的一部分),但它似乎不起作用。

这就是我所做的:

  1. 更改文件、暂存并提交
  2. 推送到远程服务器 - 成功
  3. 期望看到回声 - 没有看到回声
  4. 检查服务器上的工作文件夹 - 最新文件不存在
  5. 登录到服务器并手动运行挂钩脚本 - 最新文件将检出到工作文件夹中。

我更改了挂钩,因此除了回显消息之外它什么也不做,并且我读到推送后我应该在控制台中看到它。但这没有被显示,所以我只能假设钩子没有被触发。

我在处理请求的服务器上使用 git dot aspx 推送 HTTP,并通过本地 gui 进行推送。失败后,我尝试了 Bonobo,但通过 gui 或 bash 控制台推送时,钩子不起作用。

我假设有人在某个地方有这个工作,但经过两天的搜索,我发现的所有解决方案都没有帮助,或者有相同问题的人尚未得到解答。

(顺便说一句,我是一个 git 新手)。

Cheers.

Update

我开始认为这可能与权限有关 - 但是 Unix 权限,而不是 NTFS。当@eis提到权限时,我假设是NTFS。但经过更多挖掘后,Windows 上的 Git 似乎仍然检查 Unix 文件权限。

所以我怀疑问题是接收后文件不可执行,就像我执行ls -o它是-rw-r--r--(我相信是644)。如果我尝试通过 bash 改变它并且chmod 777 post-receive然后做ls -o权限是一样的。

奇怪的是,一旦我编辑了接收后(使用记事本++),执行位就被删除了。 (我的测试脚本以 .bat 结尾,但确实保留了其执行位......)

顺便说一句,我登录的用户是文件的所有者(根据ls -o)但我无法设置权限。

现在开始变得非常困惑。我是否遗漏了一些非常明显的东西?

Update 2

Neither chmod 777 post-receive nor chmod a+x post-receive工作。我采取了一个新的、干净的接收后文件,将其上传到服务器并检查权限并且它已执行。如果我在 Windows 中重命名该文件(以删除示例),则执行将被删除。如果我在 bash 中这样做mv执行被保留。 但是,每当我编辑文件(在 Windows 中或使用 vi 的 bash 中)时,执行就会被删除。

那么,现在的问题是为什么当我编辑文件时它会删除执行位?

希望这是最后的障碍以及它不执行的原因......


你必须给 git 打补丁才能使其工作。 builtin/receive-pack.c 中的检查用于access(path, X_OK)。在 msysgit 中,这会转移到 mingw_access ,它会丢弃 X_OK 位,因为它在 Windows 上很简单不受支持。

在 Windows 上,我们没有标志来指定文件是可执行的。系统经常对此进行一些模拟。例如,tcl 将查找 PATHEXT 环境变量中的任何扩展名来确定文件是否可执行。我们不能在这里这样做,因为钩子名称是硬编码的,没有任何扩展名。

相反,我建议更改访问测试以仅检查文件是否存在,然后调用execv在路上。 mingw 版本(在 compat/mingw.c 中)查找脚本文件并读取 shbang 行并启动适当的解释器(sh、perl 等)。于是修改builtin/receive-pack.c:run_update_hook应该让这个为你工作。目前运行的钩子使用start_command我认为这应该为你调用 execv 。

简而言之,改变访问测试,它可能会起作用。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Git - 接收后挂钩在远程 Windows 服务器上不起作用 的相关文章

  • VS 2015 + Bower:在防火墙后面不起作用

    Problem 在 Visual Studio 2015 中 使用 Bower 我的包在防火墙后面时恢复失败 并出现类似以下内容的错误 ECMDERR 无法执行 git ls remote tags heads git github com
  • 串行 I/O 与 Windows/Windows CE 重叠/不重叠

    抱歉 这不是一个大问题 但更多的是帮助那些在这些特定问题上遇到问题的人 我正在解决的问题需要使用串行 I O 但主要在 Windows CE 6 0 下运行 然而 最近有人问我该应用程序是否也可以在 Windows 下运行 所以我开始着手解
  • 在 Windows 7 上的 Sourcetree 中比较 Word docx 文件

    我一直在尝试获取在 Windows 7 上的 Sourcetree 中工作的 Word docx 文件的文本差异 我已按照此处的说明进行操作将 Microsoft Word 与 git 结合使用 http blog martinfenner
  • 在 Azure DevOps 项目之间移动存储库时保留拉取请求

    我在同一帐户内有两个 Azure DevOps 项目 我想将存储库从一个项目移动到另一个项目 这一页探索如何在具有完全保真历史记录的团队项目之间移动 git 存储库 https learn microsoft com en us azure
  • 如何在 Ubuntu VirtualBox 中运行 Meteor 应用程序并使用 Windows 主机上的编辑器进行编辑?

    我希望在运行 Ubuntu 的 virtualbox 来宾中运行一个用于开发目的的流星服务器 该项目将位于主机上的一个文件夹内 该文件夹将共享给来宾 该文件夹本身位于 Dropbox 文件夹内 这样我可以在多个虚拟机和工作站之间共享开发 但
  • 无法加载 JNI 共享库 (JDK)

    当我尝试打开时Eclipse http www eclipse org 弹出对话框指出 无法加载 JNI 共享库 C JDK bin client jvm dll 此后 Eclipse 强制关闭 我想提出以下几点 我检查了这条路径上是否存在
  • GIT:以下未跟踪的工作树文件将被签出覆盖

    我有两个分支 一个称为 master 另一个称为 dev 我目前位于 master 分支 我想转到 dev 分支将文件移动到开发服务器 但是当我执行 git checkout dev 我收到消息 以下未跟踪的工作树文件将被覆盖 查看 pag
  • Git 将一个分支合并到所有其他分支中

    我知道这个问题已经在这里被问过 https stackoverflow com questions 2329716 merging changes from master into all branches using git https
  • 如何验证文件名称在 Windows 中是否有效?

    是否有一个 Windows API 函数可以将字符串值传递给该函数 该函数将返回一个指示文件名是否有效的值 我需要验证文件名是否有效 并且我正在寻找一种简单的方法来完成此操作 而无需重新发明轮子 我正在直接使用 C 但针对的是 Win32
  • 将目录压缩为单个文件的方法有哪些

    不知道怎么问 所以我会解释一下情况 我需要存储一些压缩文件 最初的想法是创建一个文件夹并存储所需数量的压缩文件 并创建一个文件来保存有关每个压缩文件的数据 但是 我不被允许创建许多文件 只能有一个 我决定创建一个压缩文件 其中包含有关进一步
  • 当当前分支上有未提交的更改时签出另一个分支

    大多数时候 当我尝试签出另一个现有分支时 如果我在当前分支上有一些未提交的更改 Git 会不允许我这样做 所以我必须首先提交或隐藏这些更改 然而 有时 Git 确实允许我在不提交或存储这些更改的情况下签出另一个分支 并且它会将这些更改携带到
  • Git 提交失败:“请使用 -m 或 -F 选项提供消息。”

    当我键入 git commit 命令来提交文件时 我收到以下错误消息 Microsoft Visual Studio 微软 找不到命令 错误 核心编辑器 Microsoft Visual Studio 存在问题 请使用 m 或 F 选项提供
  • Git difftool 未启动外部 DiffMerge 程序

    我一直遵循 戴夫的博客条目 http www davesquared net 2009 05 setting up git difftool on windows html 链接在此answer https stackoverflow co
  • 自定义 SSH 端口上的 Git

    我的 VPS 提供商建议我将 SSH 端口保留为他们默认分配的自定义端口号 不是 22 问题是 虽然我知道我可以在创建远程配置时提供端口号 但在进行 Git 克隆时似乎无法提供相同的操作 我在用gitolite https wiki arc
  • Git - 如何将整个目录恢复到特定提交(删除任何添加的文件)

    我想恢复 git 中的目录 恢复其中的所有文件 并删除自该提交以来添加的所有文件 进行结账似乎只能满足我的第一个要求 但不会删除任何文件 我想出了最简单的解决方案 git rm path to dir git checkout
  • 如何在Windows服务器上将node.js文件作为后台进程运行?

    我正在创建一个 node js 项目并将其上传到我的 Windows 服务器 以为移动应用程序提供 API 服务 当我打开命令提示符并键入 node app js 它运行正常 但是当我关闭命令提示符时 我的 Node js 服务器停止运行
  • git 排除与忽略

    I use Tower http www git tower com 用于在 Mac 中使用 Git Tower 中的设置具有创建 gitignore 的 忽略 部分 但它还有另一个名为 排除 的部分 似乎可以将排除与 git ls fil
  • 通过 PowerShell 运行 .cmd 文件

    我正在尝试使用 PowerShell 在远程服务器上运行 cmd 文件 在我的 ps1 脚本中我尝试过 C MyDirectory MyCommand cmd 它会导致此错误 C MyDirectory MyCommand cmd is n
  • 用于推送通知的设备令牌

    我正在实施推送通知服务 我需要创建一个数据库来存储 4 个移动平台的所有设备令牌 我想根据他们的平台 iOS Android BlackBerry WP7 来组织它们 但是有什么方法可以区分平台 这样如果我只想向 Android 用户发送消
  • Git:从 master 以外的分支克隆

    我正在尝试从 Github 的存储库中提取数据 但我不想克隆主分支 我想克隆其他一些分支 当我尝试时git clone

随机推荐