确定目录是否在git控制之下

我怎么知道给定的目录是否是git respository的一部分?

(以下是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自己最好的我可以做的?

在ruby中,如果当前目录位于git仓库中, system('git rev-parse')将返回true,否则返回false。 我想象pythonic相当于应该类似的工作。

编辑:果然:

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

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

刚刚在git help rev-parsefind了这个

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

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

那么这个目录也可以被.gitignore文件忽略 – 所以你需要检查一个.git仓库,如果有的话,parsing.gitignore来查看这个目录是否确实在git仓库中。

你到底想做什么? 可能有一个更简单的方法来做到这一点。

编辑:你的意思是“这个目录是一个GIT仓库的根目录”还是你的意思是“这个目录是GIT仓库的一部分”?

对于第一个,然后检查是否有一个.git – 因为这是根,你就完成了。 对于第二个,一旦你确定你在GIT仓库中,你需要检查.gitignore来查找有问题的子目录。

为了logging,使用git status或类似的,这只是为了完整:)

向上search一棵树并不是什么大事,在bash中你可以做这个简单的单行(如果你把它放在一行上…);)如果find一个,返回0,否则返回1。

 d=`pwd` while [ "$d" != "" ]; do [ -d "$d"/.git ] && exit 0 d=${d%/*} done exit 1 

会向上search一个.git文件夹。

gitpython ,你可以像这样做一个函数:

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

我做了一些尝试,看看Git认为是一个Git仓库。

从1.9.1开始,Git认为必须在.git目录中的最小目录结构是:

 mkdir objects refs printf 'ref: refs/' > HEAD 

正如rev-parse所认可的那样。

这显然也是一个腐败的仓库,其中最有用的命令将失败。

士气是:像任何其他格式检测一样,误报是不可避免的,特别是在这里最小的回购是如此简单。

如果你想要一些健壮的东西,而不是检测它是否是一个Git回购,试着做你想做的事情,并提出错误,并处理它们,如果失败。

请求宽恕比获得许可要容易。

添加到你的.bash_profile,你的提示将始终显示活动的git分支以及是否有未提交的更改。

 function parse_git_dirty { [[ $(git status 2> /dev/null | tail -n1) != "nothing to commit (working directory clean)" ]] && echo "*" } function parse_git_branch { git branch --no-color 2> /dev/null | sed -e '/^[^*]/d' -e "s/* \(.*\)/[\1$(parse_git_dirty)]/" } export PS1=' \[\033[0;33m\]\w\[\033[00m\]\[\033[01;00m\]$(parse_git_branch): ' #PS1='\w> ' 

你会看到这个:

  ~: ~: cd code/scala-plugin/ ~/code/scala-plugin[master*]: 

git帮助rev-parse再次,我认为你可以做这样的事情:

 git rev-parse --resolve-git-dir <directory> 

并检查命令是否返回目录path本身。 根据手册git rev-parse返回目录的path,如果参数包含一个git仓库或者是一个包含git仓库path的文件。

如果您想要查找.git目录,那么在Ruby中执行这个操作非常可爱:

 require 'pathname' def gitcheck() Pathname.pwd.ascend {|p| return true if (p + ".git").directory? } false end 

我无法find类似的提升在Python中。