我希望得到只有从git仓库更改的文件的差异。现在,我使用gitpython实际得到的提交对象和混帐变化的文件,但我想要做的依赖性分析仅在文件的部分改变。有没有什么办法让从混帐蟒蛇的git的差异?还是我将不得不通过逐行读取线来比较每个文件的?
您可以使用GitPython与git的命令“差异”,只需要使用的每次提交的“树”对象或您希望看到的diff,例如分支:
repo = Repo('/git/repository')
t = repo.head.commit.tree
repo.git.diff(t)
这将打印“所有”的所有文件的diff文件包含在此承诺,所以如果你想每一个你必须在它们之间迭代。
随着实际分支是:
repo.git.diff('HEAD~1')
希望这有助于,问候。
如果您要访问的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')))
这将打印每个文件的内容。
Git不会存储的diff,因为你已经注意到了。给定两个斑点(前和变更后),您可以使用Python's difflib
module的数据进行比较。
我建议你改用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")
我不知道,如果你得到了什么你要找的!
这里是你怎么做
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)
干杯。
如果你想要做两次提交之间的文件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)
这将显示这都是为你指定的文件中的两个最新提交之间的差异。
希望这有助于。