2015-02-07 5 views
2

지금은 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;} 

가 어느 나는 트리에서 커밋을 필터링하거나 I 출력을 필터링 할 수 있습니다. 트리를 지나는 동안 해당 커밋을 제거하여 rtf 파일과 관련된 변경 사항을 제거 할 수 있을지 생각했습니다.

+0

게시물을 현재 코드의 모양으로 업데이트 할 수 있습니까? IMO, 지금은 너무 광범위합니다. –

+0

@mu 나는 세부 사항을 추가했습니다. – Zack

+0

커밋은 하나 이상의 파일을 포함 할 수 있으며, 종종 "해당 커밋을 제거"하는 것은 잘못된 해결책 일 수 있음을 기억하십시오. 각 커밋에 첨부 된 트리 개체를 반복하여 수정 된 파일을 찾은 다음 원하는 파일을 선택해야한다고 생각합니다. – larsks

답변

1

가능하다면 수정 된 파일 목록을 어떻게 얻을 수 있습니까?

아, 이제 올바른 질문을하고 있습니다. 힘내, 물론, 각 커밋에 수정 된 파일의 목록을 저장하지 않습니다. 오히려 각 커밋은 특정 시점에서 전체 저장소의 상태를 나타냅니다. 수정 된 파일을 찾으려면 한 커밋에 포함 된 파일을 이전 커밋과 비교해야합니다. 각각에

tree는 속성 (과 그 특정 파일에 포함 Tree 디렉토리를 나타내는 TreeEntry 오브젝트의리스트 자체 임) Tree 연관된 오브젝트를 지칭 repo.walk() 의해 반환 커밋.

Tree 개체에는 다른 Tree 개체와 비교할 때 사용할 수있는 diff_to_tree() 메서드가 있습니다. Patch 개체의 목록에 대한 반복기 역할을하는 Diff 개체를 반환합니다. 각 Patch 개체는 비교 대상인 두 파일 사이의 단일 파일에서 변경된 내용을 참조합니다.

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] 

우리가 a sample repository에 대해이 작업을 실행하는 경우, 우리는 처음 몇 커밋에 대한 출력 볼 수 있습니다 :

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 

... aaaand. 바라기를 이것은 이 시작하기에 충분합니다.

+0

쿨! 이렇게하면 패치와 관련된 파일을 확인할 수 있습니다! 정말 감사합니다. 이러한 것들에 대한 자세한 정보는 어디에서 찾을 수 있습니까? 현재 문서 및 검색 결과를 언급하고 있습니다. 다시 한 번 감사드립니다! – Zack

+0

[documentation] (http://www.pygit2.org/)을 읽고 대화식 Python 프롬프트에서 주변을 둘러 보면서이 모든 것을 지금 생각했습니다. 어떻게 작동 할지를 알 수있는 것은 [이 페이지] (http://www.pygit2.org/diff.html#the-patch-type)입니다. – larsks