从Github更新克隆的repo

时间:2018-03-05 15:27:29

标签: git apache ubuntu github

如果其中任何一部分令人困惑,我道歉;现在是晚上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

这应该是一次为我更新多个服务器的方法..一种连接一切的方法。目前,整个事物唯一连接的是我的额头上的键盘。

非常感谢任何帮助。

2 个答案:

答案 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