在 Dulwich 中使用分支机构(访问对象/结帐)

Working with branches in Dulwich (access objects / checkout)

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

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

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

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

在写这个问题时,我发现了一个 get_refs 方法,其中 returns 字典包含所有引用和它们所指向的提交。现在我想我可以获得最后一次提交的 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")方法来获取所需的文件版本而无需完全检出分支?某些 staged/unstaged 文件可以在程序 运行 时存储在 repo 中,我想它们会中断结帐过程。
现在对我来说主要的问题是需要 "pack" 通常的分支名称到 "refs/heads/" 形式。
如果没有更准确的方法来获取此信息 - 我希望我的问题可以帮助将来的人:)

Python: 3.6.1
德威:0.19.6

在最新版本的dulwich中,您可以使用get_object_by_path(来自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