Yanıtlar:
git describe
Komut kodunun bir insan-prezentabl "sürüm numarası" yaratmanın iyi bir yoldur. Belgelerdeki örneklerden:
Geçerli ağaç git.git gibi bir şeyle:
[torvalds@g5 git]$ git describe parent v1.0.4-14-g2414721
yani "ana" dalımın şu anki başkanı v1.0.4'e dayanıyor, ancak bunun üzerinde birkaç taahhüt bulunduğundan, açıklama ek taahhütlerin sayısını ("14") ve taahhüt için kısaltılmış bir nesne adını ekledi kendisi ("2414721").
Python içinden aşağıdakine benzer bir şey yapabilirsiniz:
import subprocess
label = subprocess.check_output(["git", "describe"]).strip()
fatal: No names found, cannot describe anything.
git describe --always
etiket bulunmazsa son işleme geri dönecek
git describe
normalde en az bir etiket gerektirir. Herhangi bir etiketiniz yoksa, --always
seçeneği kullanın. Daha fazla bilgi için git açıklama belgelerine bakın .
Komuttan git
kendiniz veri almak için hacklemeye gerek yok . GitPython bunu ve diğer birçok şeyi yapmanın çok güzel bir yoludur git
. Hatta Windows için "en iyi çaba" desteğine sahiptir.
Sonra pip install gitpython
yapabilirsin
import git
repo = git.Repo(search_parent_directories=True)
sha = repo.head.object.hexsha
ImportError: No module named gitpython
. gitpython
Yüklü son kullanıcıya güvenemezsiniz ve kodunuz çalışmaya başlamadan önce bunları yüklemelerini gerektiremezsiniz. Otomatik kurulum protokollerini dahil etmeyeceğiniz sürece, bu noktada artık temiz bir çözüm değildir.
pip
/ requirements.txt
) kullanılarak yüklenebilir . "Temiz" ne değil?
import numpy as np
stackoverflow tüm boyunca kabul edilebilir belirsiz ama gitpython yüklemek 'temiz' ve 'taşınabilir' ötesinde. Bence bu en iyi çözüm, çünkü tekerleği yeniden icat etmiyor, çirkin uygulamayı gizliyor ve alt süreçten git'in cevabını hacklemiyor.
pip
veya kolayca yükleme olanağı pip
. Bu modern senaryolarda, bir pip
çözüm "standart kütüphane" çözümü kadar portatiftir.
Bu yazı şu komutu içeriyor, Greg'in cevabı alt işlem komutunu içeriyor.
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'])
.decode('ascii').strip()
İkili dizginin kodunu çözmek için a ekleyin (ve satır sonunu kaldırın).
numpy
güzel görünümlü bir çoklu platform rutini vardır 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
numpy
"Minimal bir ortam inşa etmenin" neden gerekli olduğunu açıklayabilir misiniz ? (iyi bir nedenleri
env
platformlar arası işlevsellik için dikteyi kurmanın gerekli olduğunu varsaymıştım . Yuji'nin cevabı işe yaramaz, ancak belki de UNIX ve Windows üzerinde çalışır.
.decode('ascii')
- aksi takdirde kodlama bilinmiyor.
Alt işlem taşınabilir değilse ve bu kadar basit bir şey yapmak için bir paket yüklemek istemiyorsanız bunu da yapabilirsiniz.
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()
Bunu sadece depolarımda test ettim ama oldukça tutarlı çalışıyor gibi görünüyor.
İşte Greg'in cevabının daha eksiksiz bir sürümü :
import subprocess
print(subprocess.check_output(["git", "describe", "--always"]).strip().decode())
Veya komut dosyası depo dışından çağrılıyorsa:
import subprocess, os
os.chdir(os.path.dirname(__file__))
print(subprocess.check_output(["git", "describe", "--always"]).strip().decode())
os.chdir
, cwd=
arg kullanılabilir check_output
çalıştırmadan önce geçici değişikliklere çalışma dizinine.
Herhangi bir nedenle git kullanılamıyor ancak git repo'nuz varsa (.git klasörü bulundu), kesin karmayı .git / fetch / heads / [branch] öğesinden alabilirsiniz.
Örneğin, taahhüt kimliğini almak için depo kökünde aşağıdaki hızlı ve kirli bir Python snippet'i kullandım:
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]
git rev-parse HEAD
Komut satırından başlayın . Çıktı sözdizimi açık olmalıdır.