web-dev-qa-db-ja.com

Pythonスクリプトで現在のgitハッシュを取得します

Pythonスクリプトの出力に現在のgitハッシュを含めたいと思います(その出力を生成したコードのバージョン番号として)。

Pythonスクリプトで現在のgitハッシュにアクセスするにはどうすればよいですか?

126
Victor

git describe コマンドは、人間が表現できる「バージョン番号」のコードを作成するための良い方法です。ドキュメントの例から:

Git.gitの現在のツリーのようなものを使用すると、次のようになります。

[torvalds@g5 git]$ git describe parent
v1.0.4-14-g2414721

つまり、私の「親」ブランチの現在のヘッドはv1.0.4に基づいていますが、その上にいくつかのコミットがあるため、describeは追加のコミット数(「14」)とコミットの短縮オブジェクト名を追加しました最後にそれ自体(「2414721」)。

Python内から、次のようなことができます。

import subprocess
label = subprocess.check_output(["git", "describe"]).strip()
81
Greg Hewgill

自分でgitコマンドからデータを取得する必要はありません。 GitPython は、これを行うための非常に良い方法であり、他の多くのgitを使用できます。 Windowsの「ベストエフォート」サポートもあります。

pip install gitpythonの後にできること

import git
repo = git.Repo(search_parent_directories=True)
sha = repo.head.object.hexsha
130
guaka

この投稿 にはコマンドが含まれ、 Gregの答え にはサブプロセスコマンドが含まれます。

import subprocess

def get_git_revision_hash():
    return subprocess.check_output(['git', 'rev-parse', 'HEAD'])

def get_git_revision_short_hash():
    return subprocess.check_output(['git', 'rev-parse', '--short', 'HEAD'])
84

numpyには、setup.pyに見栄えの良い マルチプラットフォームルーチン があります。

import os
import subprocess

# Return the git revision as a string
def git_version():
    def _minimal_ext_cmd(cmd):
        # construct minimal environment
        env = {}
        for k in ['SYSTEMROOT', 'PATH']:
            v = os.environ.get(k)
            if v is not None:
                env[k] = v
        # LANGUAGE is used on win32
        env['LANGUAGE'] = 'C'
        env['LANG'] = 'C'
        env['LC_ALL'] = 'C'
        out = subprocess.Popen(cmd, stdout = subprocess.PIPE, env=env).communicate()[0]
        return out

    try:
        out = _minimal_ext_cmd(['git', 'rev-parse', 'HEAD'])
        GIT_REVISION = out.strip().decode('ascii')
    except OSError:
        GIT_REVISION = "Unknown"

    return GIT_REVISION
9
ryanjdillon

サブプロセスが移植性がなく、パッケージをインストールしてこの単純なことをしたくない場合は、これも実行できます。

import pathlib

def get_git_revision(base_path):
    git_dir = pathlib.Path(base_path) / '.git'
    with (git_dir / 'HEAD').open('r') as head:
        ref = head.readline().split(' ')[-1].strip()

    with (git_dir / ref).open('r') as git_hash:
        return git_hash.readline().strip()

私は自分のリポジトリでこれをテストしただけですが、かなり一貫して動作するようです。

2
kagronick

Greg's answer のより完全なバージョンを次に示します。

import subprocess
print(subprocess.check_output(["git", "describe", "--always"]).strip().decode())

または、スクリプトがリポジトリの外部から呼び出されている場合:

import subprocess, os
os.chdir(os.path.dirname(__file__))
print(subprocess.check_output(["git", "describe", "--always"]).strip().decode())
0
AndyP