假设我有一个文件位于:
'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选项或子进程。任何指导都将不胜感激。
答案 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