2012-11-08 15 views
7

Próbuję zrobić odpowiednik git log filename w git repozytorium git za pomocą pygit2. W dokumentacji wyjaśniono tylko, jak wykonać git log w następujący sposób:historia pygit2 blob

from pygit2 import GIT_SORT_TIME 
for commit in repo.walk(oid, GIT_SORT_TIME): 
    print(commit.hex) 

Masz jakiś pomysł?

Dzięki

EDIT:

Mam coś takiego w tej chwili, mniej lub bardziej precyzyjny:

from pygit2 import GIT_SORT_TIME, Repository 


repo = Repository('/path/to/repo') 

def iter_commits(name): 
    last_commit = None 
    last_oid = None 

    # loops through all the commits 
    for commit in repo.walk(repo.head.oid, GIT_SORT_TIME): 

     # checks if the file exists 
     if name in commit.tree: 
      # has it changed since last commit? 
      # let's compare it's sha with the previous found sha 
      oid = commit.tree[name].oid 
      has_changed = (oid != last_oid and last_oid) 

      if has_changed: 
       yield last_commit 

      last_oid = oid 
     else: 
      last_oid = None 

     last_commit = commit 

    if last_oid: 
     yield last_commit 


for commit in iter_commits("AUTHORS"): 
    print(commit.message, commit.author.name, commit.commit_time) 

Odpowiedz

1

Polecam Ci wystarczy użyć interfejsu wiersza polecenia git za , które może zapewnić ładnie sformatowany wynik, który jest naprawdę łatwy do analizy przy użyciu Pythona. Na przykład, aby uzyskać nazwę autora wiadomości dziennika i zobowiązać mieszań dla danego pliku:

import subprocess 
subprocess.check_output(['git','log','--pretty="%H,%cn%n----%B----"','some_git_file.py']) 

do pełnej listy formatów specyfikatorami że można przekazać --pretty, mają zapoznać się z dokumentacją z git log: https://www.kernel.org/pub/software/scm/git/docs/git-log.html

0

Kolejne rozwiązanie, leniwie przynosi poprawki pliku z danego zatwierdzenia. Ponieważ jest rekurencyjny, może się zepsuć, jeśli historia jest zbyt duża.

def revisions(commit, file, last=None): 
    try: 
     entry = commit.tree[file] 
    except KeyError: 
     return 
    if entry != last: 
     yield entry 
     last = entry 
    for parent in commit.parents: 
     for rev in revisions(parent, file, last): 
      yield rev