首页 > 解决方案 > 与德威的分支机构合作(访问对象/结帐)

问题描述

我对 Dulwich 有疑问(从 GitPython 切换到它,因为众所周知的 Windows 错误会在 .git 文件夹中打开文件)。

我正在尝试从当前打开的 repo 的另一个分支(上次提交的状态)获取文件。在 GitPython 中,这个任务可以很容易地解决:

file_object = repo.heads[BRANCH].commit.tree[FILENAME]

但是我没有找到任何舒适的方式来处理德威的分支机构。

在写这个问题时,我发现了一个get_refs方法,它返回包含所有 refs 的字典和它们指向的提交。现在我想我可以得到最后一次提交的 SHA,但是 refs 使用起来非常不友好——我需要使用这种形式来获得提交:

commit_id = repo.get_refs()[b"refs/heads/develop"]

之后我可以通过这种方式获取我的文件:

    tree_path = porcelain.path_to_tree_path(REPO_ROOT, os.path.join(REPO_ROOT, FILENAME))
    _, object_sha = tree_lookup_path(repo.get_object, repo[commit_id].tree, tree_path)
    file_object = repo[object_sha].data

是否有适当的(更“pythonic”/“gitonic”)方法来获取所需的文件版本,而无需完全检查分支?一些暂存/未暂存的文件可以在程序运行时存储在 repo 中,我想它们会中断结帐过程。
现在对我来说主要问题是需要将通常的分支名称“打包”为“refs/heads/”形式。
如果没有更准确的方法来获取这些信息 - 我希望我的问题将来可以帮助某人:)

Python:3.6.1
德威:0.19.6

标签: pythonpython-3.xgitgitpythondulwich

解决方案


在最新版本的德威,您可以使用get_object_by_path(from dulwich.porcelain):

print get_object_by_path(x, "some/file/path", "somebranch").data

在旧版本中,执行此操作的最短方法是(其中 x 是存储库)::

mode, object_sha = tree_lookup_path(
      x.__getitem__, x['refs/heads/master'].tree, 'some/file/path')
x[object_sha].data

推荐阅读