ฉันต้องการรวมแฮช git ปัจจุบันในผลลัพธ์ของสคริปต์ Python (เป็นหมายเลขเวอร์ชันของรหัสที่สร้างผลลัพธ์นั้น)
ฉันจะเข้าถึงแฮช git ปัจจุบันในสคริปต์ Python ของฉันได้อย่างไร
ฉันต้องการรวมแฮช git ปัจจุบันในผลลัพธ์ของสคริปต์ Python (เป็นหมายเลขเวอร์ชันของรหัสที่สร้างผลลัพธ์นั้น)
ฉันจะเข้าถึงแฮช git ปัจจุบันในสคริปต์ Python ของฉันได้อย่างไร
คำตอบ:
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()
fatal: No names found, cannot describe anything.
git describe --always
จะย้อนกลับไปสู่การคอมมิชชันล่าสุดหากไม่พบแท็ก
git describe
โดยปกติจะต้องมีอย่างน้อยหนึ่งแท็ก หากคุณไม่มีแท็กให้ใช้--always
ตัวเลือก ดูเอกสารอธิบาย gitสำหรับข้อมูลเพิ่มเติม
ไม่ต้องแฮ็คเพื่อรับข้อมูลจากgit
คำสั่งด้วยตนเอง GitPythonเป็นวิธีที่ดีมากในการทำสิ่งนี้และอื่น ๆ อีกgit
มากมาย มันยังมีการสนับสนุน "สุดความพยายาม" สำหรับ Windows
หลังจากที่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
สามารถสันนิษฐานได้ตลอดทั้ง stackoverflow แต่การติดตั้ง gitpython นั้นเกินกว่า 'สะอาด' และ 'พกพา' ฉันคิดว่านี่เป็นทางออกที่ดีที่สุดเพราะมันไม่ได้คิดค้นใหม่ล้อซ่อนการดำเนินการที่น่าเกลียดและไม่ไปแฮ็คคำตอบของ git จาก subprocess
pip
pip
ในสถานการณ์ที่ทันสมัยเหล่านี้pip
วิธีการแก้ปัญหาเป็นแบบพกพาเช่นเดียวกับโซลูชั่น "ห้องสมุดมาตรฐาน"
โพสต์นี้มีคำสั่งคำตอบของ Gregประกอบด้วยคำสั่ง subprocess
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
dict นั้นจำเป็นสำหรับการทำงานข้ามแพลตฟอร์ม คำตอบของ Yuji ไม่ได้ แต่อาจใช้ได้กับทั้ง UNIX และ Windows
.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()
ฉันได้ทดสอบสิ่งนี้กับ repos ของฉันเท่านั้น แต่ดูเหมือนว่าจะใช้งานได้ดี
ต่อไปนี้เป็นคำตอบที่สมบูรณ์ของGregมากขึ้น:
import subprocess
print(subprocess.check_output(["git", "describe", "--always"]).strip().decode())
หรือถ้าสคริปต์ถูกเรียกจากนอก repo:
import subprocess, os
os.chdir(os.path.dirname(__file__))
print(subprocess.check_output(["git", "describe", "--always"]).strip().decode())
os.chdir
การcwd=
หาเรื่องสามารถนำมาใช้ในcheck_output
การเปลี่ยนแปลงชั่วคราวไดเรกทอรีการทำงานก่อนที่จะดำเนิน
หากคุณไม่มี git พร้อมใช้งานด้วยเหตุผลบางอย่าง แต่คุณมี git repo (พบโฟลเดอร์. git) คุณสามารถดึงแฮชคอมมิตจาก. git / fetch / heads / [branch]
ตัวอย่างเช่นฉันใช้ตัวอย่างข้อมูล Python ที่รวดเร็วและสกปรกต่อไปนี้รันที่รูทที่เก็บเพื่อรับค่าคอมมิต:
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
จากบรรทัดคำสั่ง ไวยากรณ์เอาต์พุตควรชัดเจน