7

私は 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で同じスクリプトを使用できる
  • スクリプトをターゲットディレクトリにコピーすることなく、決定するパスを最終的にスクリプトに渡す

どうもありがとう!

4

6 に答える 6

22

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
于 2016-10-10T10:49:47.820 に答える
6

tdelaneyの答えは正しいですが、より一般化され、誰かのスクリプトにすばやくコピーアンドペーストできる関数を投稿したいと思います:

関数には次の 2 つの要件があります。

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
于 2014-07-05T08:08:00.800 に答える
6

近い!Popen は、プロセスを開始するより複雑なオブジェクトですが、情報を取得するには他の対話が必要です。あなたの場合、 Popen オブジェクトがプログラムの完了を待ってリターンコードを取得できるように、 wait() を呼び出す必要があります。また、コマンドが返す情報が多すぎてパイプに収まらない場合は、プログラムがハングする危険があります。「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!")
于 2013-10-30T16:15:10.617 に答える
4

Wouldn't it be easier to just have python check and see if a folder named .git is present in the current running directory?

于 2013-10-30T16:24:21.040 に答える