确定目录是否受git控制

Gru*_*rig 63 python git

如何判断给定目录是否是git存储库的一部分?

(以下是在python中,但是bash或其他东西会很好.)

os.path.isdir('.svn')
Run Code Online (Sandbox Code Playgroud)

将告诉您当前目录是否由Subversion控制.Mercurial和Git只在存储库的顶部有一个.hg/.git,所以hg我可以使用

os.system('hg -q stat 2> /dev/null > /dev/null') == 0)
Run Code Online (Sandbox Code Playgroud)

git status如果没有任何改变,则返回非零(错误)退出状态.

正在迭寻寻找.git自己的道路我能做的最好吗?

fal*_*tro 82

刚发现这个 git help rev-parse

git rev-parse --is-inside-work-tree
Run Code Online (Sandbox Code Playgroud)

true如果它在工作树中,false则打印,如果它在'.git'树中,如果它不是,则打印致命错误.'true'和'false'都打印在stdout上,退出状态为0,致命错误打印在stderr上,退出状态为128.

  • 为什么这个答案获得了如此多的选票.答案很古老,所以git中的行为可能会改变.我回答git版本1.7.1."git rev-parse --is-inside-work-tree"仅在git控制的目录下分层次地显示为true.但是,不能推断我们正在检查的目录是在git控制下,这意味着在这个目录上执行了"git add". (2认同)

Joh*_*and 43

在ruby中,system('git rev-parse')如果当前目录在git repo中,则返回true ,否则返回false.我想pythonic等价物应该类似.

编辑:果然:

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

# not in a git repo
>>> system('git rev-parse')
32768
Run Code Online (Sandbox Code Playgroud)

请注意,当您不在回购中时,STDERR上会有一些输出,如果这对您很重要.

  • @grumdrig os.path.isdir(".git")将不起作用,因为.git可以是一个只包含git目录路径的常规文件.使用git rev-parse. (7认同)
  • 谢谢!我要使用`os.path.isdir(".git")或os.system('git rev-parse 2>/dev/null>/dev/null')== 0` (3认同)

小智 7

有了gitpython,你可以做这样的功能:

import git

...

def is_git_repo(path):
    try:
        _ = git.Repo(path).git_dir
        return True
    except git.exc.InvalidGitRepositoryError:
        return False
Run Code Online (Sandbox Code Playgroud)