2014-03-05 29 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