2010-05-15 5 views
2

.git/* 파일의 간단한 파서를 작성하고 있습니다. 객체, 심판, 팩 파일 등 거의 모든 것을 다루었지만 문제가 있습니다. 내가 300M이라는 큰 저장소를 가지고 있다고 가정 해보자. 그리고/some/deep/inside/file 파일을 바꾼 모든 커밋을 찾고 싶다. 내가 지금하고 있어요 것은 : 반복적으로 I 때까지 반복 git은 파일과 관련된 커밋을 어떻게 가져 옵니까?

  • 내부에 나무를 찾는 부모 트리
  • 를 가져 오는
    • :
      • 에 의해 그 안에 파일을 찾는
      • 를 저지 마지막 가져 오는 파일로 들어가십시오.
      • 추가적으로 파일로가는 각 하위 폴더의 해시를 점검하고 있습니다. 이전 커밋과 같이 그 중 하나가 동일한 경우, 그 파일이
    • 가 나는 파일의 해시를 저장하고 부모가 커밋 가져 오기 (이 때문에 부모 디렉토리가 변경되지 않은) 변경되지 않았습니다 가정
    • 해시 변화가
      • 를 발생하면 다시 파일을 찾아 선택하면 예 다음 원래 커밋 (즉, 부모 전에 하나) 파일

    내가 이상과 유엔을 통해 그것을 반복을 변경했다 내가 처음 커밋을 할 때까지.

    이 솔루션은 효과가 있지만 좋지 않습니다. 최악의 경우, 처음 검색하는 데 3 분이 걸릴 수 있습니다 (300M 팩의 경우).

    속도를 높이는 방법이 있습니까? 나는 너무 큰 물체를 메모리에 두는 것을 피하려고 노력했지만, 지금은 다른 어떤 방법도 보지 못했습니다. 그리고 심지어 초기 메모리로드 영원히 걸릴 것 :(

    접견 및 덕분에 어떤 도움을 자식이 특정 파일의 변경 내용을 추적하는 데 사용하는 기본 알고리즘의

  • +1

    내가 궁금한데 - 왜 자식 코드가 이미 복제 한거야? 그리고 어떻게 코드를 볼 수없는 이유가 있습니까?('git log '를 실행할 때 무슨 일이 일어나는 지 추적해라.) – Cascabel

    답변

    1

    을 그 이유는 "자식 로그입니다! -. 일부 /path/to/file.txt "는 CVS, P4 등 모든 repo 파일이 파일의 히스토리가있는 서버 파일 인 경우와 같이 간단한 SCM 시스템과 비교할 때 비교적 느린 작업입니다.

    평가할 시간이 오래 걸리지 않아도됩니다 : 메모리에 보관해야 할 금액은 아주 적습니다. 이미 언급 한 주요 내용 : 트리 ID가 경로로 내려가는 것을 기억하십시오. 그거 만져봐. btree. 파일 시스템의 디렉토리와 마찬가지로 트리 객체가 매우 커지는 것은 드뭅니다 (당연히).

    팩 색인을 사용하고 있습니까? 그렇지 않다면 본질적으로 나무가 긴 델타 체인의 끝에있을 수 있으므로 전체 포장을 풀어야합니다. 인덱스가 있다면 트리 객체를 얻기 위해 여전히 델타를 적용해야하지만 최소한 빠르게 찾을 수 있어야합니다. 트리가 동일하거나 유사한베이스를 재사용하는 것이 매우 일반적이기 때문에 적용된 델타의 캐시를 유지하십시오. 대부분의 트리 객체 변경은 이전 트리 객체에서 20 바이트를 변경하는 것입니다. 따라서 트리 T1을 얻으려면 T8 객체로 시작하고 T7을 적용하여 T7, T6 ... 등을 얻어야합니다.이 트리 T2-8이 다시 참조 될 가능성이 큽니다.

    관련 문제