从Github更新克隆的repo

问题描述 投票:2回答:2

如果任何一部分令人困惑,我道歉;现在是晚上11点21分,我一直试图让这个工作从下午1点开始。

我正在使用git clone [email protected]: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

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

任何帮助是极大的赞赏。

git apache ubuntu github
2个回答
2
投票

这是一个SSH错误。对于有类似问题的任何人,请确保Git在正确的位置寻找你的id_rsa :)


1
投票

(我不确定我是否正确地诊断出你面临的问题,所以这是在黑暗中刺伤。)

您正在使用git over ssh登录github([email protected]:username/repo.git)。 如果您是从一个从不同用户shell(例如webserver用户)运行的脚本执行此操作,则所述脚本可能无法访问您的SSH-Agent,因此无法访问您的私钥并且将无法通过SSH登录。 您将需要告诉git如何使用环境变量SSH_AUTH_SOCKSSH_AGENT_PID找到加载和解锁Github私钥的SSH代理。

注意:如果您想“一次更新多个服务器”,这意味着您需要服务器端git repo镜像,请考虑使用git mirror。这不会浪费工作空间结账空间并自动镜像所有远程引用,包括(例如)github合并请求;虽然它不会看到/关心子模块(你必须在主要仓库旁边为它们手动创建镜像)。 如果你想修改文件并将它们推回去,你当然可能需要workdir。


用于通过ssh传输远程更新本地git镜像的示例Cron脚本;使用keychain工具进行ssh代理管理。 (显然,你必须调整这个概念以适应你的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
© www.soinside.com 2019 - 2024. All rights reserved.