如果其中任何一部分令人困惑,我道歉;现在是晚上11点21分,我一直试图让这个工作从下午1点开始。
我正在使用git clone git@github.com:username/repo.git /var/www
将私有Github存储库克隆到我的工作目录。这很完美!没有麻烦。
我已经在Github上设置了一个webhook来通知我的服务器任何新的推送事件。这个webhook应该从Github仓库中提取并更新任何修改过的文件。它没有这样做。
每当我调用webhook并运行我即将向您展示的命令时,它会响应表明它与“最新版本”是“最新的”,但它表明最新版本的版本是它最初是用克隆的。
我已经完成了我能找到的每个解决方案,并且似乎没有任何可用于我的特定问题的东西。我的PHP webhook目前运行以下(因为它是我放弃的地方):
git reset --hard HEAD
git pull
git status
git submodule sync
git submodule update
git submodule status
这应该是一次为我更新多个服务器的方法..一种连接一切的方法。目前,整个事物唯一连接的是我的额头上的键盘。
非常感谢任何帮助。
答案 0 :(得分:2)
这是一个SSH错误。对于有类似问题的任何人,请确保Git在正确的位置寻找您的id_rsa
:)
答案 1 :(得分:1)
(我不完全确定我是否正确地诊断出你面临的问题,所以这是在黑暗中刺伤。)
您正在使用 git over ssh 登录github(git@github.com:username/repo.git
)。
如果您是从一个从不同用户shell(例如webserver用户)运行的脚本执行此操作,则所述脚本可能无法访问您的SSH-Agent ,因此无法访问您的私钥,并且SSH登录失败。
您需要告诉git如何使用环境变量找到加载和解锁Github私钥的SSH代理
SSH_AUTH_SOCK
和 SSH_AGENT_PID
。
注意:如果您想“一次更新多个服务器”,这意味着您需要服务器端git repo镜像,请考虑使用git mirror
。
这不会浪费工作空间结账空间并自动镜像所有远程引用,包括(例如)github合并请求;
虽然它不会看到/关心子模块(你必须在主回购旁边为它们手动创建镜像)。
如果你想修改文件并将它们推回去,你当然可能需要workdir。
通过ssh传输远程更新本地git镜像的示例Cron脚本;运用 用于ssh代理管理的keychain工具 (显然,你必须调整这个概念以适应你的php脚本。)
$ crontab -e
# m h dom mon dow command
0 23 * * * cd /my/mirrors/ && sh update-mirrors.sh
脚本内容:
$ cat /my/mirrors/update-mirrors.sh
#!/bin/sh
# Git mirrors are created with `git clone --mirror ...`
# to "convert" existing local repo into mirror, use
# $ git clone --mirror --no-hardlinks <local-git-path> <new-mirror.git>
# then update the origin remote to the upstream repo and run
# `git remote update`
# Crontab script needs ssh agent
# This sources a file generated by `keychain' with the following info:
#
#SSH_AUTH_SOCK=/tmp/ssh-TLf5KUaqLQgk/agent.15740; export SSH_AUTH_SOCK;
#SSH_AGENT_PID=15731; export SSH_AGENT_PID;
#
# You may do this some other way
#
. $HOME/.keychain/`/bin/hostname`-sh
d=`pwd`
cd $d
# Now update mirrors (our convention: end dirnames with '.git')
DIRS=`ls -dR *.git`
for f in $DIRS; do
echo "$f"
cd "$d"
if [ -f "$f/HEAD" ]; then
cd "$f"
echo "* updating bare/mirror repo $f ..."
git remote update --prune
elif [ -d "$f/.git" ]; then
cd "$f"
echo "updating clone $f ..."
git remote update
#git pull
fi
done