确定目录是否在git控制下
我怎么知道一个特定的文件夹是不是在一个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
目录里,就会出现致命错误。true
和 false
会在标准输出(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,如果这对你来说很重要的话。