从repo中的任何位置获取PyGit2中当前仓库的路径

时间:2016-08-31 13:43:23

标签: python git python-3.x pygit2

我正在使用Pygit2在我正在处理的回购中运行某些操作。

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

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

mAdapter = new FirebaseRecyclerAdapter<Campaign, CampaignHolder>(Campaign.class, R.layout.recyclerview_template, CampaignHolder.class, ref) {
        @Override
        public void populateViewHolder(final CampaignHolder viewHolder, final Campaign campaign, final int position) {
            findViewById(R.id.progress_bar).setVisibility(View.INVISIBLE);
            MainActivity.this.holder = viewHolder;
            viewHolder.setTitle(campaign.title);
            //... Other "set" methods
    }
}

2 个答案:

答案 0 :(得分: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)。

答案 1 :(得分:0)

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