3

現在、pygit2 ライブラリを使用して、github リポジトリのコミット ツリーをトラバースできます。リポジトリ内の各ファイル変更のすべてのコミットを取得しています。これは、リポジトリ内の拡張子 .rtf を持つテキスト ファイルの変更を取得していることを意味します。コード変更のみに関連するコミットを除外するにはどうすればよいですか? テキスト ドキュメントに関連する変更は必要ありません。

ヘルプやポインタに感謝します。ありがとう。

last = repo[repo.head.target]

t0=last

f = open(outputFile,'w')

print t0.hex


for commit in repo.walk(last.id):
     if t0.hex == commit.hex:
        continue

     print commit.hex
     out=repo.diff(t0,commit)
     f.write(out.patch)
     t0=commit;

出力の一部として、rtf ファイルと以下の違いを取得します。

diff --git a/archived-output/NEW/action-core[best].rtf b/archived-output/NEW/action-core[best].rtf
deleted file mode 100644
index 56cdec6..0000000
--- a/archived-output/NEW/action-core[best].rtf
+++ /dev/null
@@ -1,8935 +0,0 @@
-{\rtf1\adeflang1025\ansi\ansicpg1252\uc1\adeff31507\deff0\stshfdbch31506\stshfloch31506\stshfhich31506\stshfbi31507\deflang1033\deflangfe1033\themelang1033\themelangfe0\themelangcs0{\fonttbl{\f0\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\f1\fbidi \fswiss\fcharset0\fprq2{\*\panose 020b0604020202020204}Arial;}
-{\f2\fbidi \fmodern\fcharset0\fprq1{\*\panose 02070309020205020404}Courier New;}{\f3\fbidi \froman\fcharset2\fprq2{\*\panose 05050102010706020507}Symbol;}

ツリーからコミットをフィルタリングするか、出力をフィルタリングする必要があります。ツリーをたどりながら対応するコミットを削除することで、rtf ファイルに関連する変更を削除できるかどうかを考えていました。

4

2 に答える 2

2

それが可能な場合、変更されたファイルのリストを取得するにはどうすればよいでしょうか?

ああ、今、あなたは正しい質問をしています! もちろん、Git は各コミットで変更されたファイルのリストを保存しません。むしろ、各コミットは、特定の時点でのリポジトリ全体の状態を表します。変更されたファイルを見つけるには、1 つのコミットに含まれるファイルを以前のコミットと比較する必要があります。

によって返されるコミットごとrepo.walk()に、tree属性は関連付けられたTreeオブジェクトを参照します (それ自体はTreeEntry、その特定の に含まれるファイルとディレクトリを表すオブジェクトのリストですTree)。

Treeオブジェクトには、別のオブジェクトdiff_to_tree()と比較するために使用できるメソッドがありTreeます。Diffこれは、オブジェクトのリストに対する反復子として機能するオブジェクトを返しPatchます。各Patchオブジェクトは、Tree比較されている 2 つの 間の 1 つのファイルの変更を参照します。

オブジェクトは、どのファイルが変更されたかを判断する方法であるため、これらPatchすべての鍵となります。

次のコードはこれを示しています。コミットごとに、新規、変更、または削除されたファイルのリストを出力します。

import stat
import pygit2


repo = pygit2.Repository('.')

prev = None
for cur in repo.walk(repo.head.target):

    if prev is not None:
        print prev.id
        diff = cur.tree.diff_to_tree(prev.tree)
        for patch in diff:
            print patch.status, ':', patch.new_file_path,
            if patch.new_file_path != patch.old_file_path:
                print '(was %s)' % patch.old_file_path,
            print

    if cur.parents:
        prev = cur
        cur = cur.parents[0]

サンプル リポジトリに対してこれを実行すると、最初のいくつかのコミットの出力を確認できます。

c285a21e013892ee7601a53df16942cdcbd39fe6
D : fragments/configure-flannel.sh
A : fragments/flannel-config.service.yaml
A : fragments/write-flannel-config.sh
M : kubecluster.yaml
b06de8f2f366204aa1327491fff91574e68cd4ec
M : fragments/enable-services-master.sh
M : fragments/enable-services-minion.sh
c265ddedac7162c103672022633a574ea03edf6f
M : fragments/configure-flannel.sh
88a8bd0eefd45880451f4daffd47f0e592f5a62b
A : fragments/configure-docker-storage.sh
M : fragments/write-heat-params.yaml
M : kubenode.yaml

それを次の出力と比較しますgit log --oneline --name-status

c285a21 configure flannel via systemd unit
D       fragments/configure-flannel.sh
A       fragments/flannel-config.service.yaml
A       fragments/write-flannel-config.sh
M       kubecluster.yaml
b06de8f call daemon-reload before starting services
M       fragments/enable-services-master.sh
M       fragments/enable-services-minion.sh
c265dde fix json syntax problem
M       fragments/configure-flannel.sh
88a8bd0 configure cinder volume for docker storage
A       fragments/configure-docker-storage.sh
M       fragments/write-heat-params.yaml
M       kubenode.yaml

...ああ、それはほとんど同じに見えます。うまくいけば、これで十分です。

于 2015-02-08T02:21:38.493 に答える