2013-02-20 20 views
70

Geçerli git hash dosyasını bir Python komut dosyasının çıktısına eklemek istiyorum (bu çıktıyı oluşturan kodun sürüm numarası).Geçerli git hash dosyasını bir Python betiğinde alın

Python betiğimde geçerli git hash dosyasına nasıl erişebilirim?

+4

Başlat yapabilirsiniz. Çıktı sözdizimi açık olmalıdır. –

cevap

58

git describe komutu, kodun insan tarafından sunulabilir "sürüm numarası" oluşturmanın iyi bir yoludur. belgelerinde örneklerden: Python içinden

With something like git.git current tree, I get:

[[email protected] git]$ git describe parent 
v1.0.4-14-g2414721 

i.e. the current head of my "parent" branch is based on v1.0.4, but since it has a few commits on top of that, describe has added the number of additional commits ("14") and an abbreviated object name for the commit itself ("2414721") at the end.

, aşağıdaki gibi bir şey yapabilirsiniz:

import subprocess 
label = subprocess.check_output(["git", "describe"]).strip() 
+0

Tamam ama python betiğine – Victor

+1

içinden nasıl erişebilirim Bunun için bir örnek ekleyeceğim. –

+0

Bu, kodun git repo'su olmadan çalıştırıldığı taktirde, sürüm yazdırma kodunun kırılmayacağı dezavantajına sahiptir. Örneğin, üretimde. :) – JosefAssad

49

This post contains the command, Greg'in cevabı alt işlemi komut içerir.

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

Bunu satır sonu olmadan almak için bir şerit() ekleyin :) – grasshopper

+0

Bunu belirli bir yoldan git repo için nasıl çalıştırırsınız? – pkamb

+2

@pkamb os.chdir'i git repo yoluna gitmek için os.chdir'i kullanın. –

2

numpy onun setup.py güzel görünümlü multi-platform routine sahiptir:

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 
+1

Bunu beğendim, oldukça temiz ve harici kütüphane yok – 13aal

30

git komutu kendiniz veri alma etrafında kesmek gerek yok. GitPython, bunu ve diğer git öğelerini kullanmanın çok güzel bir yoludur. Hatta Windows için "en iyi çaba" desteğine sahiptir.

pip install gitpython sonra komut satırından `git rev-ayrıştırma HEAD` ile

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

En temiz ve en portatif çözüm. – crishoj

+5

@crishoj Bu olduğunda taşınabilir olarak nasıl kullanabileceğinizi bildiğinizden emin olun: 'ImportError: Gitpython' adlı modül yok. Son kullanıcının 'gitpython' yüklü olduğu ve kodunuz işe yaramaz hale gelmeden önce bunları yüklemelerini gerektirdiği için güvenemezsiniz. Otomatik yükleme protokollerini dahil etmeyecekseniz, bu noktada artık temiz bir çözüm değildir. – user5359531

+5

@ user5359531 Farklı davranmaya başladım. GitPython, platforma özgü ayrıntılar ortaya koyan ve tüm platformlarda standart paket araçlarını ('pip' /' requirements.txt') kullanarak yüklenebilen saf bir Python uygulaması sağlar. "Temiz" ne değil? – crishoj