web-dev-qa-db-ja.com

gitpythonとgitdiff

Gitリポジトリから変更されたファイルの差分のみを取得しようとしています。現在、gitpythonを使用して実際にコミットオブジェクトとgit変更のファイルを取得していますが、変更されたファイルの部分のみに対して依存関係分析を実行したいと思います。 gitpythonからgitdiffを取得する方法はありますか?または、行ごとに読み取って各ファイルを比較する必要がありますか?

11
user1816561

GitPythonはgitコマンド「diff」で使用できます。diffを表示する各コミットまたはブランチの「tree」オブジェクトを使用する必要があります。次に例を示します。

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

これにより、このコミットに含まれるすべてのファイルの「すべての」差分が出力されるため、各ファイルが必要な場合は、それらを反復処理する必要があります。

実際のブランチでは、次のようになります。

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

よろしくお願いします。

11
Cairo

差分の内容にアクセスしたい場合は、これを試してください。

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'))) 

これにより、各ファイルの内容が出力されます。

8
D. A.

お気づきのように、Gitは差分を保存しません。 2つのblob(変更の前後)が与えられた場合、 Pythonのdifflibモジュール を使用してデータを比較できます。

4
Greg Hewgill

代わりに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")
2
Davide Spadini

あなたが探していたものを手に入れたかどうかはわかりません!

これがあなたのやり方です

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
Ciasto piekarz

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つの最新のコミットの違いが表示されます。

これがお役に立てば幸いです。

0
Nikola Đuza