나는이 질문이 본질적으로 this과 비슷하다고 말 할 것입니다. 이 고유 한 주요 차이점은 : 원시 자식 프로토콜 (기본 팩 네트워크 프로토콜에 익숙하지 않은 경우 here 및 here 참조)을 사용하려고합니다.힘내 원격 저장소에서 단일 파일을 가져옵니다.
저는 익명의 자식 저장소에 연결할 스칼라와 JGit을 사용하여 응용 프로그램을 작성하고 있습니다. 하나의 blob을 요청하고 싶습니다 ("/path/to/file.txt"@ "refs/heads/branch1"라고 생각하십시오). 궁극적으로 내 목표는 프로그래밍 방식으로 원격 저장소에서 단일 파일을 검색하는 것입니다. 할 수있는 꽤 유용한 것 같아요.
누구나이 프로토콜의 내부에 대해 살펴 보았습니다. 이것의 기본 버전은 "나는이 객체들을 원합니다, 나는이 객체들을 가지고 있습니다"라고 - 그리고 bam, 당신이 가지고 있지 않은 모든 것을 가진 packfile이 있습니다. 내 질문의 핵심은 : 비 반복적 인 방식으로 단일 객체에 대해 git-upload-packfile을 어떻게 요청합니까? 하나의 커밋 객체를 다운로드 한 다음, 트리, 하위 트리, 다른 하위 트리, 마지막으로 블롭 자체를 묻는 것이 좋습니다. 여기서 속도는 중요하지 않습니다. 주로 대역폭을 절약하려고합니다. 그러나 단순히 git-upload-packfile에 "내가 요청한 객체 하나만 제공하십시오"라고 말할 방법이없는 것 같습니다.
예, 기본적으로 개체가 제외되는 목록이 있지만 저장소의 내용에 대한 사전 지식이 필요합니다 (로컬 저장소가 없음, 기억). 모든 가능한 sha1 목록을 생성하고 원하는 것을 제외하고 모두 보낼 수는 있지만 말도 안되는 것입니다 (시간이 많이 걸리고 대역폭이 많이 소모되며 모든 곳에서 프로그래머를 상대하는 범죄)
내가 해왔 던 또 다른 가능한 해결책 지금까지 많은 시간을 들여 보지 못했지만 원격 측에서 git-upload-archive를 사용하고 있습니다.
나는 그것에 대해 JGit을 재 작성하는 것이 아니라, "JGit을 어떻게 만드나요?"라고 읽지 마십시오. 프로토콜 자체가이 기능을 수행 할 수 있는지 여부를 알고 싶습니다. 내가 원한 것을 달성하기 위해 프로토콜을 악용하는 멋지고 영리한 방법이있는 것처럼 느껴집니다. 이견있는 사람?
나는 이것에 대한 어떤 대답도 "git'이 그런 식으로 작동하지 않는다는 것부터 시작해야한다고 생각합니다."... – twalberg
@twalberg 지역 repo가 확실히합니다. 내가이 일을 할 수 있는지 궁금해. –
예, 로컬 저장소에서 단일 개체를 추출 할 수 있습니다. 그러나 와이어 프로토콜은 그렇게하도록 설계되지 않았습니다. 당신은 최종 목표를 달성 할 수 있습니다, 내 생각에, 클로페/페칭 (전체 레포를 피하기 위해 얕은 복제물을 사용하지만 여전히 커밋 + 나무 + 얼룩을 얻을 것입니다)을 로컬 레포에 저장하고 개체를 추출함으로써 당신이 유선을 통해 그것을 할 수 있다고 생각하지 마십시오 (비록 당신이 리모컨에 대한 ssh 액세스가 있다면, 당신은 가짜 일 수 있습니다). – twalberg