[git] 파이썬 스크립트에서 현재 자식 해시를 얻으십시오

파이썬 스크립트의 출력에 현재 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]