gitpython和git的差异

问题描述 投票:8回答:6

我希望得到只有从git仓库更改的文件的差异。现在,我使用gitpython实际得到的提交对象和混帐变化的文件,但我想要做的依赖性分析仅在文件的部分改变。有没有什么办法让从混帐蟒蛇的git的差异?还是我将不得不通过逐行读取线来比较每个文件的?

git git-diff gitpython
6个回答
10
投票

您可以使用GitPython与git的命令“差异”,只需要使用的每次提交的“树”对象或您希望看到的diff,例如分支:

repo = Repo('/git/repository')
t = repo.head.commit.tree
repo.git.diff(t)

这将打印“所有”的所有文件的diff文件包含在此承诺,所以如果你想每一个你必须在它们之间迭代。

随着实际分支是:

repo.git.diff('HEAD~1')

希望这有助于,问候。


8
投票

如果您要访问的DIFF的内容,试试这个:

repo = git.Repo(repo_root.as_posix())
commit_dev = repo.commit("dev")
commit_origin_dev = repo.commit("origin/dev")
diff_index = commit_origin_dev.diff(commit_dev)

for diff_item in diff_index.iter_change_type('M'):
    print("A blob:\n{}".format(diff_item.a_blob.data_stream.read().decode('utf-8')))
    print("B blob:\n{}".format(diff_item.b_blob.data_stream.read().decode('utf-8'))) 

这将打印每个文件的内容。


4
投票

Git不会存储的diff,因为你已经注意到了。给定两个斑点(前和变更后),您可以使用Python's difflib module的数据进行比较。


2
投票

我建议你改用PyDriller(它使用GitPython内部)。更容易使用:

for commit in RepositoryMining("path_to_repo").traverse_commits():
    for modified_file in commit.modifications: # here you have the list of modified files
        print(modified_file.diff)
        # etc...

您还可以分析做一个承诺:

for commit in RepositoryMining("path_to_repo", single="123213")

0
投票

我不知道,如果你得到了什么你要找的!

这里是你怎么做

import git
repo = git.Repo("path/of/repo/")

# the below gives us all commits
repo.commits()

# take the first and last commit

a_commit = repo.commits()[0]
b_commit = repo.commits()[1]

# now get the diff
repo.diff(a_commit,b_commit)

干杯。


0
投票

如果你想要做两次提交之间的文件git的差异,这是要做到这一点:

import git

repo = git.Repo()
path_to_a_file = "diff_this_file_across_commits.txt"

commits_touching_path = list(repo.iter_commits(paths=path))

print repo.git.diff(commits_touching_path[0], commits_touching_path[1], path_to_a_file)

这将显示这都是为你指定的文件中的两个最新提交之间的差异。

希望这有助于。

© www.soinside.com 2019 - 2024. All rights reserved.