Yanıtlar:
git describeKomut 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-g2414721yani "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 --alwaysetiket bulunmazsa son işleme geri dönecek
git describenormalde en az bir etiket gerektirir. Herhangi bir etiketiniz yoksa, --alwaysseçeneği kullanın. Daha fazla bilgi için git açıklama belgelerine bakın .
Komuttan gitkendiniz 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 gitpythonyapabilirsin
import git
repo = git.Repo(search_parent_directories=True)
sha = repo.head.object.hexsha
ImportError: No module named gitpython. gitpythonYü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 npstackoverflow 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.
pipveya 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).
numpygü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
envplatformlar 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 HEADKomut satırından başlayın . Çıktı sözdizimi açık olmalıdır.