파이썬 스크립트의 출력에 현재 git hash를 포함시키고 싶습니다 ( 해당 출력을 생성 한 코드 의 버전 번호 ).
파이썬 스크립트에서 현재 git hash에 어떻게 액세스 할 수 있습니까?
답변
이 git describe
명령은 사람이 표현할 수있는 코드의 “버전 번호”를 작성하는 좋은 방법입니다. 설명서의 예제에서 :
git.git 현재 트리와 같은 것으로 다음을 얻습니다.
[torvalds@g5 git]$ git describe parent v1.0.4-14-g2414721
즉, “부모”브랜치의 현재 헤드는 v1.0.4를 기반으로하지만 그 위에 몇 개의 커밋이 있으므로, 추가 커밋 수 ( “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
답변
이 게시물 에는 명령 이 포함되어 있으며 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'])
답변
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()
나는 이것을 repos에서만 테스트했지만 꽤 일관되게 작동하는 것 같습니다.
답변
다음은 Greg의 답변에 대한 완전한 버전입니다 .
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())
답변
어떤 이유로 git을 사용할 수 없지만 git repo (.git 폴더가 있음)가있는 경우 .git / fetch / heads / [branch]에서 커밋 해시를 가져올 수 있습니다
예를 들어, 저장소 루트에서 다음과 같은 빠르고 더러운 Python 스 니펫을 사용하여 커밋 ID를 얻었습니다.
git_head = '.git\\HEAD'
# Open .git\HEAD file:
with open(git_head, 'r') as git_head_file:
# Contains e.g. ref: ref/heads/master if on "master"
git_head_data = str(git_head_file.read())
# Open the correct file in .git\ref\heads\[branch]
git_head_ref = '.git\\%s' % git_head_data.split(' ')[1].replace('/', '\\').strip()
# Get the commit hash ([:7] used to get "--short")
with open(git_head_ref, 'r') as git_head_ref_file:
commit_id = git_head_ref_file.read().strip()[:7]