找到文件所在的git存储库的根目录

时间:2014-02-27 21:47:42

标签: python git

在Python中工作(例如运行脚本)时,如何找到脚本所在的git存储库根目录的路径?

到目前为止,我知道我可以通过以下方式获得当前路径:

path_to_containing_folder = os.path.dirname(os.path.realpath(__file__))

如何找出git存储库的位置?

8 个答案:

答案 0 :(得分:19)

查找.git目录并不适用于所有情况。正确的git命令是:

git rev-parse --show-toplevel

答案 1 :(得分:15)

使用GitPython模块http://gitpython.readthedocs.io/en/stable/

pip install gitpython

假设您在/path/to/.git有一个本地Git仓库。以下示例接收/path/to/your/file作为输入,它正确地将Git根返回为/path/to/

import git

def get_git_root(path):

        git_repo = git.Repo(path, search_parent_directories=True)
        git_root = git_repo.git.rev_parse("--show-toplevel")
        print git_root

if __name__ == "__main__":
    get_git_root("/path/to/your/file")

答案 2 :(得分:7)

我刚刚为此任务编写了一个小python模块: https://github.com/MaxNoe/python-gitpath

使用pip install git+https://github.com/maxnoe/python-gitpath

安装

用法:

import gitpath

print(gitpath.root())
print(gitpath.abspath('myfile.txt'))

gitpath.abspath(relative_path)将返回您计算机上的绝对路径 对于相对于git存储库根目录的路径。

获取root的代码部分来自Ryne Everetts评论:

from subprocess import check_output, CalledProcessError
from functools import lru_cache

@lru_cache(maxsize=1)
def root():
    ''' returns the absolute path of the repository root '''
    try:
        base = check_output('git rev-parse --show-toplevel', shell=True)
    except CalledProcessError:
        raise IOError('Current working directory is not a git repository')
    return base.decode('utf-8').strip()

缓存会第二次调用root() ca.快3500倍(使用ipython%%timeit测量)

答案 3 :(得分:7)

GitPython模块为您提供了开箱即用的此属性:

Africa/Casablanca

答案 4 :(得分:3)

此功能是通用的(不依赖于外部模块或调用git命令)。 它从给定路径中搜索,以查找包含.git目录的第一个路径。

def find_vcs_root(test, dirs=(".git",), default=None):
    import os
    prev, test = None, os.path.abspath(test)
    while prev != test:
        if any(os.path.isdir(os.path.join(test, d)) for d in dirs):
            return test
        prev, test = test, os.path.abspath(os.path.join(test, os.pardir))
    return default

使用示例:

import os
print(vcs_root(os.path.dirname(__file__)))

或检查其他版本控制:

import os
print(vcs_root(os.path.dirname(__file__)), dirs=(".hg", ".git", ".svn"))

答案 5 :(得分:2)

没有任何外部库:

TRANSFORM Sum([Weight]) AS SumWeight
SELECT [month], item, store, manager
FROM Table1
GROUP BY [month], item, store, manager
PIVOT [type];

答案 6 :(得分:1)

我对python知之甚少,但我认为你可以继续使用

进入目录
os.path.abspath(os.path.join(dir, '..'))

直到您检测到.git目录(os.walk可能有帮助)

答案 7 :(得分:0)

我发现其他答案对于任务来说太混乱了,所以我创建了这个功能来解决这个问题。基本上,它遍历给定路径的父目录并返回第一个包含“.git”目录的目录。如果没有找到,则返回 None。

from pathlib import Path

def find_repo(path):
    "Find repository root from the path's parents"
    for path in Path(path).parents:
        # Check whether "path/.git" exists and is a directory
        git_dir = path / ".git"
        if git_dir.is_dir():
            return path

# Find the repo root where the script is
find_repo(__file__)

Pathlib 是标准库 (Python 3) 的一部分,因此没有额外的依赖项。如果这是你唯一需要的东西,Gitpython 就有点矫枉过正了。