【问题标题】:syncing Github with Pythonanywhere将 Github 与 Pythonanywhere 同步
【发布时间】:2018-06-11 08:12:15
【问题描述】:

我想将 pythonanywhere 项目与 github 帐户同步。 就像如果我在 github 上对我的项目进行更改,它会在 pythonanywhere 自动更新。 请原谅我是 github 新手。

【问题讨论】:

    标签: git github pythonanywhere


    【解决方案1】:

    我刚刚为我自己的 Pythonanywhere 项目解决了这个问题。我不想打扰 SSH 密钥,所以我使用了 Github webhooks 和一个在我的 pythonanywhere 帐户上运行的 Python 脚本。 Python 脚本在源代码更新时侦听 Github 发出的 webhook,并在 pythonanywhere 上执行脚本以拉入新文件。

    这是场景:

    • 我在本地计算机上使用 Visual Studio 进行开发,并将我的代码推送到我的 Github 存储库
    • Github 自动发出一个接收后 webhook,其中包含我在 pythonanywhere 服务器上收听的 json 文件
    • 在我的 python 脚本中,只要 webhook URL 被触发,我就执行一个 pull 命令。之后我在 pythonanyh 上的所有文件都是最新的

    提示:

    • 如果您还没有在您的 pythonanywhere 项目上启动 git,只需打开一个 bash 控制台,导航到您的根文件夹,例如“家/用户名”并输入git init,然后输入git remote add origin https://github.com/yourusername/yourreponame.git
    • 您可以在 github 存储库的设置页面中创建 post-receive webhook
    • 我使用 GitPython 包来执行拉取请求
    • 以下是我在烧瓶 Web 服务器中使用的 Python 代码,用于等待 Webhook 执行。它基本上执行一个预定义的 bash 命令,该命令在您的 pythonanywhere 文件结构中自动创建,位于.git/hooks/ 下。这个 bash 文件将执行一个简单的git pull origin master

    我的 flask_app.py 文件的内容:

    from flask import Flask, request
    import git
    
    app = Flask(__name__)
    
    @app.route('/webhook', methods=['POST'])
        def webhook():
            if request.method == 'POST':
                repo = git.Repo('./myproject')
                origin = repo.remotes.origin
                repo.create_head('master', 
            origin.refs.master).set_tracking_branch(origin.refs.master).checkout()
                origin.pull()
                return '', 200
            else:
                return '', 400
    
    #
    # Below here follows you python back-end code
    #
    

    如果您需要更多信息,请告诉我。

    【讨论】:

    • Wanni 您介意将所有导入语句包含在您的上述函数中吗? 'import git' 很清楚,但是'request' 和'app' 是从哪里来的呢?
    • 这可以存在于应该更新的同一个 webapp 中吗?
    • @aadibajpai 是的,上面的 python 代码位于运行我的烧瓶服务器/后端的同一文件 (flask_app.py) 中。
    • @Wanni 如何重新加载?
    • 好的,我调查过了——如果你添加一个合并后的钩子来触摸 wsgi 文件,那么如果拉取成功,webapp 将重新加载:)
    【解决方案2】:

    你可以考虑:

    如果您只想在 pythonanywhere 上进行开发,您需要生成一个 SSH 密钥,并将公共密钥添加到您的 GitHub 帐户,如“How to get your code in and out of PythonAnywhere”中的建议。

    【讨论】:

    • 将 SSH 密钥添加到 GitHub 后需要做什么? GitHub是从PA更新的想法吗?
    • @aadibajpai 是的,你可以从 PA 推送到 GitHub。
    • 虽然如 OP 的问题中所述,但不会自动执行。
    • @aadibajpai 我想不是,但问题是关于自动将 GitHub 更改传播到 PA,而不是相反。
    【解决方案3】:

    对于 Django

    首先你需要安装 gitpython:pip install gitpython

    更新views.py:

    from django.http import HttpResponse
    from git import Repo # 
    from django.views.decorators.csrf import csrf_exempt
    
    @csrf_exempt
    def webhook(request):
        if request.method == 'POST':
            repo = Repo('./django-schools')
            git = repo.git
            git.checkout('master')
            git.pull()
            return HttpResponse('pulled_success')
        return HttpResponse('get_request', status=400)
    

    【讨论】:

    • 这是我找到的最接近的解决方案,但是,我收到以下错误:“git.exc.GitCommandError: Cmd('git') failed due to: exit code(128) cmdline: git checkout master stderr: '致命:此操作必须在工作树中运行'"。对此进行研究后,似乎解决方案是“在其他地方创建另一个存储库,在该存储库中添加一个文件,然后将其推送到裸存储库。”我为什么需要创建另一个存储库毫无意义。
    猜你喜欢
    • 2011-07-19
    • 2015-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多