如何用Python3(pygit2)知道git存储库是否干净?

时间:2015-11-15 03:34:20

标签: python python-3.x pygit2

我正在尝试确定git存储库中是否需要或git commit。我想出了这个适合我的代码:

def is_dirty(repo):
  import pygit2
  status = repo.status()
  for filepath, flags in status.items():
    if flags != pygit2.GIT_STATUS_CURRENT:
        if flags != 16384:
            return True
  return False;

但这非常低效:repo.status()需要永远 - 至少与git status命令行相比。

所以我的问题是:是否有更有效的方法来了解存储库是否干净?

PS:我正在使用python3。使用python2,我使用了具有git函数的模块is_dirty

3 个答案:

答案 0 :(得分:1)

真的很脏的解决方案? python:执行带有git status的shell脚本

sh:
VAR= $(git status)
dump var to file 

python:
meanwhile your python script is waiting for the file to be created
while(1)
if(os.path.exists(file_path))
status = read_file_function(file_path)
break 

愚蠢而简单,可能很明显

答案 1 :(得分:1)

Repository.status()的性能在快速测试中表现良好。

典型用法:

import pygit2
from pathlib import Path
from typing import Dict, Union
repo_path: Union[Path, str] = Path("/path/to/your/repo")
repo = pygit2.Repository(pygit2.discover_repository(repo_path))
status: Dict[str, int] = repo.status()
print(status)
# {} (nothing to commit, working tree clean)
# {"myfile" : 256} (myfile is modified but not added)

我的函数删除文件模式已更改的文件的版本(代码16384,GIT_FILEMODE_TREE)。

def get_repo_status(repo: pygit2.Repository) -> Dict[str, int]:
    # get the integer representing filemode changes
    changed_filemode_status_code: int = pygit2.GIT_FILEMODE_TREE
    original_status_dict: Dict[str, int] = repo.status()
    # transfer any non-filemode changes to a new dictionary
    status_dict: Dict[str, int] = {}
    for filename, code in original_status_dict.items():
        if code != changed_filemode_status_code:
            status_dict[filename] = code
    return status_dict

性能:

%timeit repo.status()
# 2.23 ms per loop
%timeit get_repo_status(repo)
# 2.28 ms per loop
%timeit subprocess.run(["git", "status"]) # yes, I know, this is not really comparable..
# 11.3 ms per loop

答案 2 :(得分:0)

5年后。这就是我现在要做的

pip3 install GitPython

然后

import git
repo = git.Repo("path/to/my/repo")
if repo.is_dirty(untracked_files=True):
   do_work()