Pythonスクリプトの出力に現在のgitハッシュを含めたいと思います(その出力を生成したコードのバージョン番号として)。
Pythonスクリプトで現在のgitハッシュにアクセスするにはどうすればよいですか?
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()
自分でgit
コマンドからデータを取得する必要はありません。 GitPython は、これを行うための非常に良い方法であり、他の多くのgit
を使用できます。 Windowsの「ベストエフォート」サポートもあります。
pip install gitpython
の後にできること
import git
repo = git.Repo(search_parent_directories=True)
sha = repo.head.object.hexsha
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
サブプロセスが移植性がなく、パッケージをインストールしてこの単純なことをしたくない場合は、これも実行できます。
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()
私は自分のリポジトリでこれをテストしただけですが、かなり一貫して動作するようです。
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())