পাইথন স্ক্রিপ্টে বর্তমান গিট হ্যাশ পান


164

আমি পাইথন স্ক্রিপ্টের আউটপুটে বর্তমান গিট হ্যাশটি অন্তর্ভুক্ত করতে চাই (কোডটির সংস্করণ সংখ্যা যা সেই আউটপুট তৈরি করে)।

আমি কীভাবে আমার পাইথন স্ক্রিপ্টে বর্তমান গিট হ্যাশ অ্যাক্সেস করতে পারি?


7
git rev-parse HEADকমান্ড লাইন থেকে শুরু করুন । আউটপুট বাক্য গঠনটি সুস্পষ্ট হওয়া উচিত।
মেল নিকোলসন

উত্তর:


96

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()

3
এতে একটি অপূর্ণতা রয়েছে যে কোডটি যদি কখনও গিট রেপো উপস্থিত না করে চালানো হয় তবে সংস্করণ মুদ্রণ কোডটি নষ্ট হয়ে যাবে। উদাহরণস্বরূপ, উত্পাদন। :)
জোসেফআসাদ

5
@ জোসেফআসাদ: আপনার যদি উত্পাদনের কোনও সংস্করণ শনাক্তকারী প্রয়োজন হয় তবে আপনার স্থাপনার পদ্ধতিটি উপরের কোডটি চালিত করবে এবং ফলাফলটি উত্পাদিত কোডটিতে "বেকড" করা উচিত।
গ্রেগ হিউগিল

14
নোট করুন যে উপস্থিত fatal: No names found, cannot describe anything.
গিটিংটি

40
git describe --alwaysকোনও ট্যাগ না পাওয়া গেলে শেষ প্রতিশ্রুতিতে পতিত হবে
লিওনার্দো

5
@ চর্লিপার্কার: git describeসাধারণত কমপক্ষে একটি ট্যাগ লাগতে পারে । আপনার যদি কোনও ট্যাগ না থাকে তবে --alwaysবিকল্পটি ব্যবহার করুন । দেখুন Git ডকুমেন্টেশন বর্ণনা আরও তথ্যের জন্য।
গ্রেগ হিউগিল

189

gitকমান্ড থেকে নিজেকে তথ্য পাওয়ার আশেপাশে হ্যাক করার দরকার নেই । গিটি পাইথন এটি করার একটি খুব সুন্দর উপায় এবং অন্যান্য প্রচুর gitজিনিস। এমনকি এটি উইন্ডোজ জন্য "সেরা প্রচেষ্টা" সমর্থন আছে।

pip install gitpythonআপনি করতে পারেন পরে

import git
repo = git.Repo(search_parent_directories=True)
sha = repo.head.object.hexsha

9
@crishoj না নিশ্চিত কিভাবে আপনি এটা পোর্টেবল কল করতে পারেন যখন এই ঘটনার: ImportError: No module named gitpython। আপনি শেষ ব্যবহারকারী gitpythonইনস্টল করেছেন এবং আপনার কোড কাজ করার পূর্বে এগুলি ইনস্টল করার জন্য প্রয়োজনীয় হওয়া এটিকে বহনযোগ্য নয়। আপনি যদি না স্বয়ংক্রিয় ইনস্টলেশন প্রোটোকল অন্তর্ভুক্ত না করেন, তবে এই মুহুর্তে এটি আর পরিষ্কার সমাধান নয়।
ব্যবহারকারীর 35359531

39
@ user5359531 আমি আলাদা হতে অনুরোধ করছি। গিটপাইথন একটি বিশুদ্ধ পাইথন বাস্তবায়ন সরবরাহ করে, প্ল্যাটফর্ম-নির্দিষ্ট বিশদ বিবরণ বিমূর্ত করে তোলে এবং এটি সমস্ত প্ল্যাটফর্মে স্ট্যান্ডার্ড প্যাকেজ সরঞ্জাম ( pip/ requirements.txt) ব্যবহার করে ইনস্টলযোগ্য । "পরিষ্কার" কি না?
ক্রিশোজ

22
পাইথনে জিনিসগুলি করার এটি সাধারণ উপায়। ওপি যদি সেই প্রয়োজনীয়তাগুলির প্রয়োজন হয়, তবে তারা তাই বলত। আমরা মন-পাঠক নই, প্রতিটি প্রশ্নের প্রতিটি ঘটনার পূর্বাভাস দিতে পারি না। এই পথটি মিথ্যা পাগলামি।
ওল্ডটাইনফয়েল

14
@ ব্যবহারকারী ৫৩৫৫ 31 31১, import numpy as npপুরো স্ট্যাকওভারফ্লো জুড়ে কেন ধরে নেওয়া যায় তা আমি অস্পষ্ট তবে গিটপিথন ইনস্টল করা 'পরিষ্কার' এবং 'বহনযোগ্য' এর বাইরেও। আমি মনে করি এটি এখন পর্যন্ত সর্বোত্তম সমাধান, কারণ এটি চাকাটিকে পুনরায় উদ্ভাবন করে না, কুৎসিত বাস্তবায়নকে আড়াল করে এবং সাবপ্রসেস থেকে গিটের উত্তর হ্যাক করার আশেপাশে যায় না।
Jblasco

7
@ user5359531 আমি সাধারণভাবে সম্মত হয়েছি যে প্রতিটি ছোট সমস্যায় আপনার একটি চকচকে নতুন গ্রন্থাগার নিক্ষেপ করা উচিত নয়, আপনার "বহনযোগ্যতা" এর সংজ্ঞাটি আধুনিক পরিস্থিতিতে অবহেলা করে বলে মনে হচ্ছে যেখানে বিকাশকারীরা সমস্ত পরিবেশের উপর সম্পূর্ণ নিয়ন্ত্রণ রাখে বলেছে অ্যাপ্লিকেশন চালু আছে 2018 সালে আমাদের রয়েছে pipসহজেই ইনস্টল করার ক্ষমতা সহ ডকারের পাত্রে, ভার্চুয়াল পরিবেশ এবং মেশিনের চিত্রগুলি (যেমন: এএমআই) pip। এই আধুনিক পরিস্থিতিতে, একটি pipসমাধান একটি "স্ট্যান্ডার্ড লাইব্রেরি" সমাধানের মতো পোর্টেবল।
রায়ান

106

এই পোস্টে কমান্ড রয়েছে, গ্রেগের উত্তরটিতে সাবপ্রসেস কমান্ড রয়েছে।

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'])

32
লাইন বিরতি ছাড়াই এটি পেতে একটি স্ট্রিপ () যুক্ত করুন :)
ফড়িংহীন

কোনও নির্দিষ্ট পথে গিট রেপোর জন্য আপনি কীভাবে এটি চালাবেন?
পেকম্ব

2
@ পকম্ব আপনি যে গিট রেপোর সাথে কাজ করতে আগ্রহী তার পথে সিডি করতে os.chdir ব্যবহার করুন
জ্যাক ক্রিটস

যদি বর্তমানে পরীক্ষিত সংশোধনটি শাখা প্রধান না হয় তবে এটি কি ভুল উত্তর দেবে না?
সর্বাধিক

7
.decode('ascii').strip()বাইনারি স্ট্রিং ডিকোড করতে একটি যুক্ত করুন (এবং লাইন ব্রেকটি সরান)।
পিএফএম

13

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

2
আমি এটি পছন্দ করি, বেশ পরিষ্কার এবং কোনও বাহ্যিক লাইব্রেরি নেই
13aal

ইউজির উত্তরটি কেবলমাত্র এক লাইনের কোডে একই ফলাফল সরবরাহ করে যা একই ফলাফল দেয়। numpy"ন্যূনতম পরিবেশ নির্মান" কেন প্রয়োজনীয় হয়েছে তা আপনি ব্যাখ্যা করতে পারেন ? (ধরে
নিলাম

আমি কেবল তাদের রেপোতে এটি লক্ষ্য করেছি এবং আগ্রহীদের জন্য এই প্রশ্নটিতে এটি যুক্ত করার সিদ্ধান্ত নিয়েছি। আমি উইন্ডোজে বিকাশ করি না, তাই আমি এটি পরীক্ষা করে দেখিনি, তবে আমি ধরে নিয়েছিলাম যে envক্রস-প্ল্যাটফর্মের কার্যকারিতার জন্য ডেক সেটআপ করা প্রয়োজনীয় ছিল। ইউজির উত্তরটি দেয় না, তবে সম্ভবত এটি ইউনিক্স এবং উইন্ডোজ উভয় ক্ষেত্রেই কাজ করে।
ryanjdillon

গিট দোষের দিকে তাকিয়ে তারা 11 বছর আগে এসভিএন এর জন্য বাগ ফিক্স হিসাবে এটি করেছিল : github.com/numpy/numpy/commit/… গিটের জন্য বাগ ফিক্স আর প্রয়োজন নেই possible
শে

@ MD004 @ryanjdillon তারা লোকেল সেট করেছে যাতে .decode('ascii')কাজ করে - অন্যথায় এনকোডিং অজানা।
z0r

7

যদি সাবপ্রসেস পোর্টেবল না হয় এবং আপনি এই সাধারণ কিছু করার জন্য কোনও প্যাকেজ ইনস্টল করতে না চান তবে আপনি এটিও করতে পারেন।

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()

আমি কেবল এটি আমার পরীক্ষাগুলিতে পরীক্ষা করেছি তবে মনে হয় এটি বেশ দৃ .়ভাবে কাজ করে।


কখনও কখনও / রেফার্স / পাওয়া যায় না, তবে বর্তমান কমিট আইডি "প্যাকড-রেফস" পাওয়া যায়।
am9417

6

গ্রেগের উত্তরের আরও একটি সম্পূর্ণ সংস্করণ এখানে :

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())

1
ব্যবহারের পরিবর্তে os.chdir, cwd=আরগটি check_outputকার্যকর করার আগে কার্যক্ষম ডিরেক্টরিকে অস্থায়ী পরিবর্তনগুলিতে ব্যবহার করা যেতে পারে ।
মার্চ

0

যদি আপনার কোনও কারণে গিট উপলব্ধ না থাকে তবে আপনার কাছে গিট রেপো রয়েছে (.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]
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.