What Happen When Pull Event On Bare
Overview
클라이언트에서 pull event 가 발생했을때의 흐름을 설명한다. 클라이언트에서 git pull 명령이 실행되면, 서버에서는 Fetch 요청에 응답하는 과정만 담당하며, 읽기 중심의 동작(read only)을 수행하며, 실제 Merge나 Rebase 등의 작업은 클라이언트 측에서 진행된다.
Key Terms Explained
- Pack: Git 객체를 효율적으로 저장하기위한 압축 파일 형식으로, .pack 파일과 인덱스역할을 하는.idx 파일로 구성된다.
- Bare Repository: .git 폴더만 존재하며, 작업 디렉터리(working tree)가 없는 저장소 형태로, 서버에서 원격 저장소로 사용된다.
Flow
1. Discovery
원격 상태 파악과 필요 데이터 판단까지의 전반 흐름
1-1. Advertise-Refs
클라이언트가 git pull 수행 시, 서버의 git-upload-pack 엔드포인트로 refs 정보를 요청
- 클라이언트 요청
GET /<repo>.git/info/refs?service=git-upload-pack
- 서버 응답 항목
- HEAD
- refs/heads/* (브랜치 정보)
- refs/tags/* (태그 정보)
- capabilities 목록
2. Negotiation
2-1. wants/have 도출
서버가 제공한 refs 정보를 기반으로 로컬과 상태 대조를 통한 추가요청을 위한 객체 도출 (wants, have)
- 요청 전송
POST /<repo>.git/git-upload-pack
- 요청 구성: want, have, shallow 등
- 목적: 공통 조상 확인, 부족한 객체만 선별 요청
3.Packfile Retrieval
필요 객체에 대한 팩 생성, 전송, 수신 및 적용 흐름(클라이언트는 위 Negotiation 단계에서 받은 refs 정보를 바탕으로, 서버가 가지고 있지만 로컬에는 없는 커밋들을 요청한다.)
요청에는 want, have, shallow 옵션 등이 포함됨
3-1. 서버 → 클라이언트 전송 (side-band)
- side-band 스트림: ch1(pack 데이터), ch2(진행률), ch3(에러)
- thin-pack, ofs-delta, bitmap index 등 최적화 적용 가능
3-2. 클라이언트 수신·적용
.pack수신 및.idx인덱스 생성- 로컬 객체 DB 반영
Diagram
sequenceDiagram
autonumber
participant C as Client
participant S as Server (JGit)
alt Discovery Advertise
C->>S: GET /info/refs?service=git-upload-pack
S-->>C: refs + capabilities (Advertise-Refs)
end
alt Negotiation
C->>C: compute wants/haves
end
alt Fetching PackFile
C->>S: POST /git-upload-pack (wants, haves, done)
S-->>C: PACK (side-band, thin-pack)
C->>C: update remote-tracking branch, merge/rebase
end