从post-update钩子推送Git失败- X不是一个存储库



我正在尝试设置一个中央存储库,当它从我的本地机器推送到另一个存储库时,它将自动推送到另一个存储库。我已经在谷歌上搜索了好几天了,我已经尝试了我能找到的所有命令组合,但都没有运气。

设置:我首先将中央存储库创建为裸机,然后将其作为非裸机克隆到第二台机器上。我将第二台机器作为一个名为"www"的远程设备添加到第一台机器上。我确认我可以在第一台机器上手动执行"git push www master",它将通过SSH更新第二台机器。然后,我通过HTTP将存储库克隆到本地开发机器上。我可以从本地推到中央。

当前形式的post-update钩子:

#!/bin/bash
cd /var/git_repos/site.git
unset $(git rev-parse --local-env-vars)
branch=$(git rev-parse --abbrev-ref HEAD)
if [ "$branch" == "master" ];
then
  echo "Pushing $branch to www..."
  env -i git push www master
fi
exec git update-server-info

我从各种SO和博客文章中拼凑了这些。在第一台机器的CLI中手动执行它可以正常工作("cd/var/git_rerepository/site.git/hooks;. ./post-update"),但是当作为钩子执行时,我得到错误信息"www不是Git存储库"。

输出:

$ git push
Password:
Counting objects: 5, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 264 bytes, done.
Total 3 (delta 0), reused 0 (delta 0)
remote: Pushing master to www...
remote: fatal: 'www' does not appear to be a git repository
remote: fatal: The remote end hung up unexpectedly
To https://xxx@git.xxx.xxx/site.git
   e3d3a1d..103c819  master -> master
谁能告诉我我做错了什么?

编辑:我已经弄清楚,我最初的问题是在网站上的权限。Git没有完全设置正确。解决了那个问题,我又遇到了一个新问题。

新输出:

$ git push
Password:
Counting objects: 5, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 332 bytes, done.
Total 3 (delta 1), reused 0 (delta 0)
remote: I am apache <---- Output of "whoami" for debugging
remote: Pushing master to www...
remote: ssh: connect to host 192.168.1.79 port 22: Permission denied
remote: fatal: The remote end hung up unexpectedly
To https://nnn@git.nnn.nnn/site.git
   29d504c..f14f201  master -> master

我试着在/etc/sudoers文件中添加以下内容,但没有成功:

apache ALL=NOPASSWD: /usr/bin/ssh

这是尝试推送到未知远程时得到的错误。试一试:

git push thisisprobablynotaremote master
检查

git remote -v
并确保WWW是正确定义的,也检查
git config --list

www也应该在那里。

打印钩子本身的所有命令的输出并比较输出

我建议将www更改为您要推送到的远程回购的完整url。另外,将master改为master:master可能会有所帮助。

不要做

unset $(git rev-parse --local-env-vars)

我想你看到了钩子,人们试图从不同的仓库做一个git拉。你只是做了所有与当前回购相关的命令。所以你不需要这样做。

同样,不要这样做:
env -i git push www master

删除env -i

最新更新