代码之家  ›  专栏  ›  技术社区  ›  Grumdrig

确定目录是否受Git控制

  •  62
  • Grumdrig  · 技术社区  · 15 年前

    如何判断给定的目录是否是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 我能做的最好的自己?

    10 回复  |  直到 6 年前
        1
  •  43
  •   John Hyland    15 年前

    红宝石, system('git rev-parse') 如果当前目录在git repo中,则返回true,否则返回false。我想与之相当的蟒蛇应该也能起到同样的作用。

    编辑: 果然:

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

    请注意,当您不在回购中时,stderr上有一些输出,如果这对您很重要的话。

        2
  •  81
  •   falstro    15 年前

    刚刚在 git help rev-parse

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

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

        3
  •  5
  •   0 _ Edward Ned Harvey    7 年前

    gitpython ,您可以这样做:

    import git
    
    ...
    
    def is_git_repo(path):
        try:
            _ = git.Repo(path).git_dir
            return True
        except git.exc.InvalidGitRepositoryError:
            return False
    
        4
  •  4
  •   Trevoke    15 年前

    好吧,目录也可以被.gitignore文件忽略-因此您需要检查.git存储库,如果有,请分析.gitignore以查看该目录是否确实在git存储库中。

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

    编辑: 您的意思是“这个目录是Git存储库的根目录”还是“这个目录是Git存储库的一部分”?

    对于第一个,那么只需检查是否有一个.git——因为它在根目录下,你就完成了。 对于第二个,一旦确定自己在Git存储库中,就需要检查.GitIgnore中有问题的子目录。

        5
  •  4
  •   falstro    14 年前

    对于记录,使用git status或类似的方法,这只是为了完整性::)

    向上搜索一棵树并不重要,在bash中,您可以执行这个简单的一行(如果您将它放在一行上…);)如果找到一个,则返回0,否则返回1。

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

    将向上搜索.git文件夹。

        6
  •  3
  •   Ciro Santilli OurBigBook.com    6 年前

    很难定义 .git/ 仓库是

    我做了一些试验,看看Git认为什么是Git存储库。

    从1.9.1开始,最小目录结构必须位于 .git Git要考虑的目录是:

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

    经认可 rev-parse .

    很明显,它也是一个损坏的存储库,其中最有用的命令将失败。

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

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

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

        7
  •  2
  •   eerpini    12 年前

    Git帮助版本分析 同样,我认为你可以做如下的事情:

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

    并检查命令是否返回目录路径本身。根据手册git rev parse,如果参数包含git repo或是包含git repo路径的文件,则返回目录路径。

        8
  •  1
  •   retronym    15 年前

    将它添加到.bash_配置文件中,提示将始终显示活动的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*]: 
    
        9
  •  0
  •   skagedal    10 年前

    如果你想找一个 .git 目录,这里有一个在Ruby中实现这一点的可爱方法:

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

    我无法在巨蟒中找到类似提升的东西。

        10
  •  0
  •   Ray    7 年前

    使用 git rev-parse --is-inside-work-tree 随着 subprocess.Popen ,您可以检查是否从输出中打印“true”,指示目录是否具有git repo:

    import subprocess
    
    repo_dir = "../path/to/check/" 
    
    command = ['git', 'rev-parse', '--is-inside-work-tree']
    process = subprocess.Popen(command, stdout=subprocess.PIPE, cwd=repo_dir,
                               universal_newlines=True)
    process_output = process.communicate()[0]
    
    is_git_repo = str(process_output.strip())
    
    if is_git_repo == "true":
        print("success! git repo found under {0}".format(repo_dir))
    else:
        print("sorry. no git repo found under {0}".format(repo_dir))