Gitリポジトリから変更されたファイルの差分のみを取得しようとしています。現在、gitpythonを使用して実際にコミットオブジェクトとgit変更のファイルを取得していますが、変更されたファイルの部分のみに対して依存関係分析を実行したいと思います。 gitpythonからgitdiffを取得する方法はありますか?または、行ごとに読み取って各ファイルを比較する必要がありますか?
GitPythonはgitコマンド「diff」で使用できます。diffを表示する各コミットまたはブランチの「tree」オブジェクトを使用する必要があります。次に例を示します。
repo = Repo('/git/repository')
t = repo.head.commit.tree
repo.git.diff(t)
これにより、このコミットに含まれるすべてのファイルの「すべての」差分が出力されるため、各ファイルが必要な場合は、それらを反復処理する必要があります。
実際のブランチでは、次のようになります。
repo.git.diff('HEAD~1')
よろしくお願いします。
差分の内容にアクセスしたい場合は、これを試してください。
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は差分を保存しません。 2つのblob(変更の前後)が与えられた場合、 Pythonのdifflib
モジュール を使用してデータを比較できます。
代わりに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)
乾杯。
2つのコミットの間にファイルに対してgitdiffを実行する場合は、次の方法で実行できます。
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)
これにより、指定したファイルに対して実行された2つの最新のコミットの違いが表示されます。
これがお役に立てば幸いです。