gitai로 에이전트 여럿이 main에 동시에 반영해도 거절되지 않게 하는 법
gitai는 동시 반영을 둘 다 받는다
에이전트 alpha와 beta가 같은 main에서 파일 하나씩을 고쳐 같은 순간 반영했습니다. 일반 git에서는 한쪽 push가 거절됐고, gitai에서는 둘 다 들어갔습니다.
graft log의 rewritten은 서버가 beta의 커밋을 alpha 커밋 뒤로 옮겨 다시 만들었다는 표시입니다.
gitai는 GitLab의 Git 서버 Gitaly를 고쳐 만든 MIT 라이선스 서버이고, 에이전트는 graft 명령으로 서버에 반영을 맡깁니다.
git clone https://github.com/feder-cr/git-ai.gitcd git-aimake build # Go 1.26·C 컴파일러·Meson·Ninja 필요examples/graft/quickstart.sh # 임시 폴더에 서버와 에이전트 둘을 띄워 반영까지서버가 뜨면 에이전트마다 작업 폴더에서 graft commit -m으로 커밋을 만들고, 반영을 같은 순간 겁니다.
export GRAFT_ADDRESS=unix:/srv/graft/run/gitaly.sock GRAFT_STORAGE=defaultfor a in alpha beta; do (cd $a && GRAFT_TOKEN=$(cat /srv/graft/tokens/$a) GRAFT_USER=$a \ GRAFT_AUTHOR="$a <$a@example.com>" graft land main) &donewait두 요청이 한 묶음에 들어가지 않는다면
서버는 첫 요청이 들어온 뒤 window만큼 기다렸다가 그사이 쌓인 요청을 한 번에 반영합니다. 기본값 10ms에서는 0.3초 간격으로 들어온 두 요청이 따로 반영됐고, 뒤 요청도 서버가 다시 얹어 클라이언트 재시도 없이 들어갔습니다. 위 화면은 창을 500ms로 늘린 서버에서 떴습니다.
[graft]standalone = true[graft.land.batch]window = "500ms" # 기본 10ms거절은 브랜치 갱신 방식에서 생긴다
git은 브랜치를 compare-and-swap으로 바꿔서, 먼저 온 쪽이 main을 바꾸면 뒤쪽 push는 거절됩니다. compare-and-swap은 지금 값이 내가 읽은 값과 같을 때만 새 값으로 바꾸는 연산입니다. push도 "main이 A일 때만 C로 바꿔 달라"는 요청입니다.
git은 늦은 쪽을 거절하고, gitai는 B 위에 다시 얹는다
git은 거절된 쪽에 받아 와서 다시 올리라고 돌려보냅니다. gitai는 브랜치마다 서버 메모리에 대기열을 두고, 진 요청을 새 tip 위로 옮겨 바로 다시 시도합니다. 창 안에 함께 들어온 요청은 차례로 얹은 뒤 갱신 한 번으로 반영합니다.
Anthropic은 하루 병합이 3만 건으로 늘자 git을 떠나 Scion으로 옮겼습니다. gitai는 그 공개 설계를 따라 만든 서버이고, Anthropic과는 관계가 없습니다.
gitai 제작자가 에이전트 50대로 250건을 반영했을 때, 에이전트가 각자 재시도하는 쪽은 반영 한 건마다 스물여섯 번 넘게 시도했습니다.
- 반영된 변경100~106건200건
- 반영 한 건당 시도26.5~28.7회1.0회
- p99 지연4.4~5.2초1.9~2.7초
gitai가 반영하지 않은 50건은 일부러 넣은 충돌이라 에이전트에게 돌아갔고, 충돌 해결 규칙을 켜면 250건이 모두 들어갑니다.
에이전트마다 반영할 브랜치를 정할 수 있다
gitai는 에이전트마다 토큰을 따로 두고, 정책으로 누가 어느 브랜치를 바꿀지 정합니다. 규칙은 위에서부터 차례로 보고, 처음 맞는 규칙을 따릅니다. 아래는 alpha만 main을 바꾸고 나머지 에이전트는 다른 브랜치에만 반영하게 한 설정입니다.
[[graft.policy]]actor = "alpha"refs = ["refs/heads/main"]allow = true[[graft.policy]]refs = ["refs/heads/main"]allow = false[[graft.policy]]refs = ["refs/heads/**"]allow = truebeta가 main으로 반영하면 두 번째 규칙에 걸려 거절되고, 커밋은 임시 브랜치에 남습니다. 거절된 반영은 graft log에 남지 않습니다. 같은 커밋을 graft land agent/beta로 보내면 반영됩니다.
팀 저장소에 올릴지 고민한다면
gitai는 웹 화면·이슈·CI가 없는 Git 서버입니다. 0.x 버전이라 1.0 전에 인터페이스가 바뀔 수 있고, 데이터베이스·오브젝트 저장소에 저장하는 모드는 팩 정리(가비지 컬렉션)가 아직 없습니다. 저장소 사본을 올려 에이전트 몇 대로 먼저 시험합니다.