0

我正在使用 Pygit2 在我正在处理的存储库中运行某些操作。

如果我的代码文件不在 repo 的根目录下,如何从 repo 中的任何位置获取 repo 的路径?

如果从 root 调用该函数,我可以执行以下操作,但是如果我从存储库代码中的任何位置运行它怎么办?

$ cd /home/test/Desktop/code/Project
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.

$ ipython3

In [1]: import os, pygit2
In [2]: repo = pygit2.Repository(os.getcwd())
4

2 回答 2

1

一种选择是简单地遍历父目录,直到找到一个.git目录:

import os
import pathlib
import pygit2

def find_toplevel(path, last=None):
    path = pathlib.Path(path).absolute()

    if path == last:
        return None
    if (path / '.git').is_dir():
        return path

    return find_toplevel(path.parent, last=path)

toplevel = find_toplevel('.')
if toplevel is not None:
  repo = pygit2.Repository(str(toplevel))

当然,这里有一些警告。.git如果有人设置了GIT_DIR环境变量,您不一定会找到 目录。如果你有一个 git 工作树,那么.git它是一个文件,而不是一个目录,并且libgit2似乎无法处理这个问题(从 0.24 版开始)。

于 2016-08-31T14:24:46.910 回答
1

pygit2确实有这样做的机制,来自libgit2

from pygit2 import Repository, discover_repository


def get_repo(path: str) -> Repository:
    repo_path = discover_repository(path)
    if not repo_path:
        raise ValueError(f"No repository found at '{path}' and its parents")
    return Repository(repo_path)

https://www.pygit2.org/repository.html?highlight=discover#pygit2.discover_repository

于 2020-03-03T16:42:02.580 回答