在Python中工作(例如运行脚本)时,如何找到脚本所在的git存储库根目录的路径?
到目前为止,我知道我可以通过以下方式获得当前路径:
path_to_containing_folder = os.path.dirname(os.path.realpath(__file__))
如何找出git存储库的位置?
答案 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 就有点矫枉过正了。