2012-11-08 10 views
7

私はgit log filename相当のことをpygit2を使ってgit bareリポジトリでやろうとしています。このドキュメントでは、git logの操作方法についてのみ説明しています。pygit2ブロブの履歴

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

ご存知ありませんか?

おかげ

EDIT:

私は、現時点ではこのような何かを持ってる多かれ少なかれ正確:

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) 

答えて

1

私はただのgitのコマンドラインインターフェイスを使用するためにあなたをお勧めしますこれは、Pythonを使って解析するのが簡単な形式の出力を提供します。たとえば、著者名を取得するには、メッセージをログに記録し、指定したファイルのハッシュをコミット:あなたは--prettyに渡すことができる書式指定子の完全なリストについては

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

、ドキュメントを見てgitloghttps://www.kernel.org/pub/software/scm/git/docs/git-log.html

0

もう1つの解決方法は、特定のコミットからのファイルのリビジョンを遅延させます。再帰的なので、履歴が大きすぎると破損する可能性があります。

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