使用Python检查GIT文件的修订版

时间:2014-03-05 23:29:29

标签: python git

假设我有一个文件位于:

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

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

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

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

2 个答案:

答案 0 :(得分:0)

从看到源代码看来,GitPython似乎仍然使用子进程。

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

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

答案 1 :(得分:0)

我最终进入了子进程路由。我不喜欢首先使用GitPython设置repo对象,因为无法保证我的路径甚至是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