जवाबों:
git describe
आदेश कोड का मनुष्य द्वारा आकर्षक "संस्करण संख्या" बनाने का एक अच्छा तरीका है। प्रलेखन में उदाहरणों से:
Git.git के वर्तमान पेड़ की तरह कुछ के साथ, मुझे मिलता है:
[torvalds@g5 git]$ git describe parent v1.0.4-14-g2414721
यानी मेरी "पैरेंट" शाखा का वर्तमान प्रमुख v1.0.4 पर आधारित है, लेकिन चूंकि इसमें कुछ कमियाँ हैं, इसलिए वर्णन में अतिरिक्त कमिट्स की संख्या ("14") और एक संक्षिप्त वस्तु का नाम शामिल है। अंत में खुद ("2414721")।
पायथन के भीतर से, आप निम्न की तरह कुछ कर सकते हैं:
import subprocess
label = subprocess.check_output(["git", "describe"]).strip()
fatal: No names found, cannot describe anything.
git describe --always
पिछले करने के लिए वापस आने जाएगा प्रतिबद्ध अगर कोई टैग पाए जाते हैं
git describe
आम तौर पर कम से कम एक टैग की आवश्यकता होती है। यदि आपके पास कोई टैग नहीं है, तो --always
विकल्प का उपयोग करें । देखें Git प्रलेखन का वर्णन अधिक जानकारी के लिए।
git
खुद कमांड से डेटा प्राप्त करने के लिए हैक करने की आवश्यकता नहीं है । GitPython यह करने के लिए एक बहुत अच्छा तरीका है और अन्य git
सामान। यहां तक कि इसमें विंडोज के लिए "सर्वश्रेष्ठ प्रयास" समर्थन भी है।
के बाद pip install gitpython
आप कर सकते हैं
import git
repo = git.Repo(search_parent_directories=True)
sha = repo.head.object.hexsha
ImportError: No module named gitpython
:। आप gitpython
स्थापित होने वाले अंतिम उपयोगकर्ता पर भरोसा नहीं कर सकते हैं , और उन्हें अपने कोड के काम करने से पहले इसे स्थापित करने की आवश्यकता होती है जो इसे पोर्टेबल नहीं बनाता है। जब तक आप स्वचालित इंस्टॉलेशन प्रोटोकॉल को शामिल नहीं करने जा रहे हैं, तब तक यह एक स्वच्छ समाधान नहीं है।
pip
/ requirements.txt
) का उपयोग करके इंस्टॉल करने योग्य होता है। "साफ" क्या नहीं है?
import numpy as np
के पूरे क्षेत्र में क्यों ग्रहण किया जा सकता है लेकिन gitpython स्थापित करना 'स्वच्छ' और 'पोर्टेबल' से परे है। मुझे लगता है कि यह अब तक का सबसे अच्छा समाधान है, क्योंकि यह पहिया को सुदृढ़ नहीं करता है, बदसूरत कार्यान्वयन को दूर करता है और उपप्रकार से गिट के जवाब को हैक करने के आसपास नहीं जाता है।
pip
या आसानी से स्थापित करने की क्षमता pip
। इन आधुनिक परिदृश्यों में, एक pip
समाधान "मानक पुस्तकालय" समाधान के रूप में पोर्टेबल है।
इस पोस्ट में कमांड है, ग्रेग के जवाब में सबप्रोसेस कमांड है।
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()
बाइनरी स्ट्रिंग को डीकोड करने के लिए एक जोड़ें (और लाइन ब्रेक को हटा दें)।
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
env
क्रॉस-प्लेटफ़ॉर्म कार्यक्षमता के लिए तानाशाही स्थापित करना आवश्यक था। युजी का जवाब नहीं है, लेकिन शायद यह यूनिक्स और विंडोज दोनों पर काम करता है।
.decode('ascii')
काम करें - अन्यथा एन्कोडिंग अज्ञात है।
यदि सबप्रोसेस पोर्टेबल नहीं है और आप इस साधारण से कुछ करने के लिए पैकेज स्थापित नहीं करना चाहते हैं तो आप यह भी कर सकते हैं।
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()
मैंने केवल अपने रेपो पर इसका परीक्षण किया है लेकिन ऐसा लगता है कि यह लगातार काम करता है।
यहाँ ग्रेग के उत्तर का अधिक पूर्ण संस्करण दिया गया है :
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())
os.chdir
, निष्पादन से पहले कार्य निर्देशिका को अस्थायी परिवर्तन करने के लिए cwd=
arg का उपयोग किया जा सकता है check_output
।
यदि आपके पास किसी कारण से git उपलब्ध नहीं है, लेकिन आपके पास git रेपो (.git फ़ोल्डर पाया जाता है) है, तो आप .it / fetch / heads / [ब्रांच] से प्रतिबद्ध हैश प्राप्त कर सकते हैं।
उदाहरण के लिए, मैंने कमेटी बनाने के लिए रिपॉजिटरी रूट पर निम्न त्वरित और गंदे पायथन स्निपेट का उपयोग किया है:
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
कमांड लाइन से शुरू करें । आउटपुट सिंटैक्स स्पष्ट होना चाहिए।