【问题标题】:pulling and integrating remote changes with pygit2使用 pygit2 拉取和集成远程更改
【发布时间】:2014-06-05 17:13:52
【问题描述】:

我确实有以下问题。我正在编写一个脚本,它在文件夹中搜索存储库,在网上查找遥控器并将所有新数据拉入存储库,通知我新的更改。主要思想很明确。我在 Windows 7 x64 上使用 python 2.7,使用 pygit2 访问 git 功能。命令行支持简单的命令“git pull 'origin'”,但是git api比较复杂,看不懂。好吧,我走了这么远: import pygit2 orepository=pygit2.Repository("path/to/repository/.git") oremote=repo.remotes[0] result=oremote.fetch() 此代码检索新对象并将其下载到存储库中,但不会更新主分支或检出新数据。通过使用 TortoiseGit 检查存储库,我发现没有任何方法已检出,甚至在显示日志时也不会出现新的日志消息。我需要使用 git pull 命令来刷新存储库和工作副本。现在我的问题是:我需要做什么才能通过使用 pygit2 来完成所有这些工作?我的意思是,我通过获取它们来下载更改,但是我需要做什么呢?我也想更新主分支和工作副本... 预先感谢您帮助我解决我的问题。 最好的问候。

【问题讨论】:

    标签: python git fetch pull pygit2


    【解决方案1】:

    Remote.fetch() 不会更新工作目录中的文件,因为这离它的工作很远。如果您想更新当前分支并签出这些文件,您还需要通过Repository.create_reference()Reference.target= 执行这些步骤,具体取决于您当时拥有的数据,然后例如Repository.checkout_head() 如果您确实决定更新。

    git-pull 是一个脚本,它根据传递的配置和标志执行许多不同的步骤。当您编写一个在多个存储库上模拟它的工具时,您需要弄清楚您想要做什么,而不是希望一切都设置好,以便 git-pull 不会让您感到惊讶。

    【讨论】:

    • Repository.checkout_head()Repository.checkout('HEAD') 有什么区别。文档中提到,不带参数调用 Repository.checkout 会将 checkout_index 作为默认值。
    • 如果我更新了参考Repository.checkout('HEAD'),则索引保持修改,即Repository.status() 显示有更改的文件。使用 Repository.checkout_head() 时也会清除索引。你能解释一下这里发生了什么吗?
    • 如果不按顺序查看代码或命令的输出,那将是相当困难的。请注意,默认策略是GIT_CHECKOUT_STRATEGY_SAFE,如果存在冲突,它将中止结帐,这可能是正在发生的事情,因为您说更改的文件“保留”。
    • 调用 Repository.checkout_head() 和 Repository.checkout('HEAD') 没有区别。我希望尽快更新文档以更清楚地表明这一点。
    猜你喜欢
    • 2014-08-30
    • 2015-03-01
    • 2011-06-14
    • 2018-07-27
    • 1970-01-01
    • 2022-01-22
    • 2020-06-10
    • 2022-01-27
    相关资源
    最近更新 更多