উত্তর:
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কমান্ড থেকে নিজেকে তথ্য পাওয়ার আশেপাশে হ্যাক করার দরকার নেই । গিটি পাইথন এটি করার একটি খুব সুন্দর উপায় এবং অন্যান্য প্রচুর 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পুরো স্ট্যাকওভারফ্লো জুড়ে কেন ধরে নেওয়া যায় তা আমি অস্পষ্ট তবে গিটপিথন ইনস্টল করা 'পরিষ্কার' এবং 'বহনযোগ্য' এর বাইরেও। আমি মনে করি এটি এখন পর্যন্ত সর্বোত্তম সমাধান, কারণ এটি চাকাটিকে পুনরায় উদ্ভাবন করে না, কুৎসিত বাস্তবায়নকে আড়াল করে এবং সাবপ্রসেস থেকে গিটের উত্তর হ্যাক করার আশেপাশে যায় না।
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=আরগটি check_outputকার্যকর করার আগে কার্যক্ষম ডিরেক্টরিকে অস্থায়ী পরিবর্তনগুলিতে ব্যবহার করা যেতে পারে ।
যদি আপনার কোনও কারণে গিট উপলব্ধ না থাকে তবে আপনার কাছে গিট রেপো রয়েছে (.git ফোল্ডারটি পাওয়া যায়), আপনি .git / ফেচ / হেডস / [শাখা] থেকে কমিট হ্যাশ আনতে পারেন
উদাহরণস্বরূপ, প্রতিশ্রুতিবদ্ধ আইডি পেতে আমি সংগ্রহস্থলের মূলটিতে নীচের দ্রুত এবং নোংরা পাইথন স্নিপেট ব্যবহার করেছি:
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কমান্ড লাইন থেকে শুরু করুন । আউটপুট বাক্য গঠনটি সুস্পষ্ট হওয়া উচিত।