用于确定目录是否为git存储库的Python脚本

2024-04-24 19:04:28 发布

您现在位置:Python中文网/ 问答频道 /正文

我刚刚开始使用Python,我的第一个任务是编写一个脚本来确定运行它的目录是否是git存储库。一位同学建议这样做:

#! /usr/bin/env python

from subprocess import Popen, PIPE, STDOUT
if Popen(("git", "branch"), stderr=STDOUT, stdout=PIPE).returncode != 0:
    print("Nope!")
else:
    print("Yup!")

它应该根据控制台命令“git branch”的返回代码打印输出。但是,脚本在存储库中不起作用。

不管怎样,我都会很感激你的建议。

任务还包括:

  • 能够在Windows上使用相同的脚本
  • 确定到脚本的路径的最终传递,而无需将其复制到目标目录

非常感谢!


Tags: fromgit目录env脚本branchbinusr
3条回答

接近!Popen是一个更复杂的对象,它启动一个进程,但需要其他交互来获取信息。在您的情况下,需要调用wait(),以便Popen对象等待程序完成以获取返回代码。如果命令返回的信息太多,无法放入管道中,也可能导致程序挂起。尝试“call”(它调用wait for you)并将命令输出发送到位桶。

#! /usr/bin/env python

from subprocess import call, STDOUT
import os
if call(["git", "branch"], stderr=STDOUT, stdout=open(os.devnull, 'w')) != 0:
    print("Nope!")
else:
    print("Yup!")

安装gitpython,例如pip install gitpython

然后做一个这样的函数:

import git

...

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

虽然tdelaney的答案是正确的,但我想发布一个更通用的函数,可以快速复制粘贴到某人的脚本中:

功能有两个要求:

import os
import subprocess

而且功能相当简单:

def is_git_directory(path = '.'):
    return subprocess.call(['git', '-C', path, 'status'], stderr=subprocess.STDOUT, stdout = open(os.devnull, 'w')) == 0

相关问题 更多 >