确定目录是否在git控制下

73 投票
11 回答
41563 浏览
提问于 2025-04-15 17:54

我怎么知道一个特定的文件夹是不是在一个git仓库里呢?

(下面的内容是用python写的,不过用bash或者其他语言也可以。)

os.path.isdir('.svn')

这段代码可以告诉你当前的文件夹是否被Subversion控制。Mercurial和Git的仓库顶层都有一个隐藏文件夹,分别是.hg和.git,所以对于hg我可以使用

os.system('hg -q stat 2> /dev/null > /dev/null') == 0)

但是如果没有任何变化,git status会返回一个非零的(错误)状态。

我自己向上查找路径,看看有没有.git,这样做算是最好的办法吗?

11 个回答

8

使用 gitpython,你可以写一个这样的函数:

import git

...

def is_git_repo(path):
    try:
        _ = git.Repo(path).git_dir
        return True
    except git.exc.InvalidGitRepositoryError:
        return False
98

刚刚在 git help rev-parse 里发现这个内容

git rev-parse --is-inside-work-tree

如果文件在工作区(也就是你正在编辑的地方),就会显示 true;如果文件在 .git 目录里(这是Git用来管理版本的地方),就会显示 false。如果文件既不在工作区也不在 .git 目录里,就会出现致命错误。truefalse 会在标准输出(stdout)上显示,并且退出状态是0,表示一切正常;而致命错误会在标准错误(stderr)上显示,退出状态是128,表示出现了问题。

50

在Ruby中,system('git rev-parse')这个命令会检查当前目录是否在一个git版本库里。如果在的话,它会返回true(真),如果不在,则返回false(假)。我想在Python中也有类似的方式可以做到这一点。

补充:果然是这样:

# in a git repo, running ipython
>>> system('git rev-parse')
0

# not in a git repo
>>> system('git rev-parse')
32768

需要注意的是,当你不在版本库里时,会有一些错误信息输出到STDERR,如果这对你来说很重要的话。

撰写回答