2014-03-05 32 views
1

GIT文件的修订可以说我有位于一个文件:检查与Python

'C:/Users/jdoe/development/git/something/A.txt' 

我想定义一个Python函数,将检查,如果该文件是git仓库内。如果它不在git仓库中,我希望函数返回None。如果它在git仓库中,我希望函数返回文件的状态以及文件修订版本。

def git_check(path): 
     if path is not in a git repo: 
      return None 
     else: 
      return (status, last_clean_revision) 

我不知道我是否应该追求GitPython选项或子进程。任何指导将不胜感激。

+0

与GitPython肯定去:它应该允许使用Git的工作更直接,而不是解析一个命令行工具的输出。 – janos

回答

0

从看到源代码看来,GitPython无论如何都使用子进程。

我会坚持使用GitPython来防止自己从git解析输出文本的头痛。

就指导而言,似乎没有太多的文档,所以我只是建议你阅读源代码本身,这似乎是很好的评论。

0

我结束了子流程路线。我不喜欢首先使用GitPython设置回购对象,因为不能保证我的路径甚至是git存储库的一部分。

对于那些有兴趣,这里是我结束了:

import subprocess 

def git_check(path): # haha, get it? 
    # check if the file is in a git repository 
    proc = subprocess.Popen(['git', 
          'rev-parse', 
          '--is-inside-work-tree',], 
          cwd = path, 
          stderr=subprocess.STDOUT, stdout=subprocess.PIPE) 
    if 'true' not in proc.communicate()[0]: 
     return None 

    # check the status of the repository 
    proc = subprocess.Popen(['git', 
          'status',], 
          cwd = path, 
          stderr=subprocess.STDOUT, stdout=subprocess.PIPE) 
    log_lines = proc.communicate()[0].split('\n') 
    modified_files = [x.split(':')[1].lstrip() for x in log_lines if 'modified' in x] 
    new_files = [x.split(':')[1].lstrip() for x in log_lines if 'new file' in x] 

    # get log information 
    proc = subprocess.Popen(['git', 
          'log','-1'], 
          cwd = path, 
          stderr=subprocess.STDOUT, stdout=subprocess.PIPE)   
    log_lines = proc.communicate()[0].split('\n') 
    commit = ' '.join(log_lines[0].split()[1:]) 
    author = ' '.join(log_lines[1].split()[1:]) 
    date = ' '.join(log_lines[2].split()[1:]) 


    git_info = {'commit':commit, 
       'author':author, 
       'data': date, 
       'new files':new_files, 
       'modified files':modified_files} 

    return git_info