Git post-receive钩子checkout失败:‘–f’无匹配文件求助
解决Git post-receive钩子checkout失败的问题
你遇到的问题其实根源很清晰——钩子脚本里的参数符号用错了!让我一步步帮你搞定:
问题诊断
你看到的报错 remote: error: pathspec '–f' did not match any file(s) known to git. 里,–f 是中文长破折号,而Git的checkout命令需要的是英文短横杠的 -f 参数。旧版本Git(比如你之前用的1.7.1)可能对这种符号不敏感,但Git 2.x版本对参数解析更严格,直接就识别不了这个非法的pathspec了。
修复步骤
修正post-receive钩子内容
登录到你的Linode服务器,编辑/home/username/website.git/hooks/post-receive文件,把里面的–f改成-f,正确的脚本应该是:#!/bin/sh GIT_WORK_TREE=/home/username/www git checkout -f注意检查整个脚本里的符号,确保所有横杠都是英文的。
确认钩子权限(再次检查)
虽然你已经设置过执行权限,但可以再确认一遍:chmod +x /home/username/website.git/hooks/post-receive同时确保钩子文件的所有者是你的用户名,避免因权限归属导致执行失败。
修正推送命令并测试
回到本地仓库,修正推送命令里的小笔误(refs/head/master应该是refs/heads/master),重新执行:git push web +master:refs/heads/master
额外排查点(如果修复后仍有问题)
- 确认
/home/username/www文件夹存在,并且你的用户对这个目录有读写权限 - 在服务器上手动执行钩子脚本里的命令
GIT_WORK_TREE=/home/username/www git checkout -f,看看是否能正常将代码检出到工作树 - 检查裸仓库的配置,确保没有设置禁止检出的参数
内容的提问来源于stack exchange,提问作者Christoph Nolte
相关产品推荐
相关产品推荐

