GitPython检查git pull是否更改了本地文件

时间:2018-05-31 22:06:41

标签: python python-3.x git gitpython

使用GitPython,我想只在拉动后对本地文件进行更改时才调用函数。例如,如果我在一台单独的计算机上进行推送。然后拉动它按预期工作的第一台计算机,但不提供任何输出。理想的输出是更改的文件列表。或者只是告诉我拉动是否有错误的东西,因为分支是最新的或没有发生变化的布尔值而没有拉动。我相信我可以刮repo.git.status(),但它似乎很粗糙。环顾四周看起来我也可以比较分支的变化,但它似乎是很多额外的代码和远程调用。是否有正确的方法只使用拉动呼叫?

while True:
    repo = git.Repo()
    o = repo.remotes.origin
    o.pull()
    changed = NOT_SURE
    if changed:
        do_something()
    print(repo.git.status())
    time.sleep(POLLING_RATE)

更新:此功能可用于检查是否进行了更改但未在没有额外远程调用的情况下更改文件

while True:
    print(str(time.ctime())+": Checking for updates")
    repo = git.Repo()
    current_hash = repo.head.object.hexsha
    o = repo.remotes.origin
    o.pull()
    pull_hash = repo.head.object.hexsha
    if current_hash != pull_hash:
        print("files have changed")
    else:
        print("no changes")

    time.sleep(config.GIT_POLL_RATE)

2 个答案:

答案 0 :(得分:1)

我很感谢这已经晚了两年,但是,我希望它可能仍然有用。

我刚刚编写了pullcheck,这是一个简单的脚本,可以从存储库中提取,检查更改,如果发现更改,则重新启动目标。我发现这种方法能够识别出拉动中的变化。

def git_pull_change(path):
    repo = git.Repo(path)
    current = repo.head.commit

    repo.remotes.origin.pull()

    if current == repo.head.commit:
        print("Repo not changed. Sleep mode activated.")
        return False
    else:
        print("Repo changed! Activated.")
        return True

答案 1 :(得分:0)

如果您只想查看远程方面的更改,也可以使用git-fetch

如果要打印更改,则可能应该探索git-diff,例如:


POLLING_RATE = 10
REM_BRANCH = 'master'

def pretty_diff(diff):
    for cht in diff.change_type:
        changes = list(diff.iter_change_type(cht))
        if len(changes) == 0:
            continue
        print("Changes type:", cht)
        for d in changes:
            print(d.b_path)


while True:
    repo = git.Repo('.')
    current_hash = repo.head.object.hexsha
    o = repo.remotes.origin
    o.fetch()
    changed = o.refs[REM_BRANCH].object.hexsha != current_hash
    if changed:
        # do_something()
        diff = repo.head.commit.diff(o.refs[REM_BRANCH].object.hexsha)
        pretty_diff(diff)
    time.sleep(POLLING_RATE)

git-diff支持不同的更改类型:

print(diff.change_type)
#('A', 'C', 'D', 'R', 'M', 'T')

对于不同的更改类型,您可以做不同的事情。