确定目录是否在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-parse
find了这个
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中。