모르지 나도.. 정답이 어디 있간디? 있으면 나도 보고싶다.

일단 내가 구상한 방법은 git clone이다. 포크는 풀리퀘를 구현하기 위한 발판이나 마찬가지인데 나중에 풀리퀘 구현 방법에 따라 포크 구현 방법이 달라질지도 모르겠다.

"user1/project1을 보고 있는 user2가 fork 버튼을 누르면 user1/project1과 동일한 user2/project1이 생긴다."

대충 포크의 요구사항을 기술하면 위와 같은데, 이걸 달성하기 가장 쉬운 방법은 Clone 인것 같다.

DVCS 호스팅 서버에서 user2 디렉토리에서 git clone user1/project1을 실행해서 user1/project1을 clone 하면 다음과 같은 일이 벌어진다.

user2/project1이라는 디렉토리가 만들어지고 그 안으로 walking tree가 들어오고 그 안에 .git 디렉토리가 들어온다. 그리고 레퍼런스가 두개 생긴다. 하나는 remote/origin으로 user1/project1을 가리키는 레퍼런스고, 하나는 master 브랜치인데 이건 fork 할 프로젝트의 기본 브랜치가 뭐냐에 따라 달라질 수 있지만 보통은 master겠지.

https://www.kernel.org/pub/software/scm/git/docs/git-clone.html

이제 이걸 JGit으로 할라면 어떻게 해야되냐가 문제인데.. 스택오버를 뒤지면 잘 나온다.

[gist id="5486780"]

cloneRepository()를 호출하면 CloneCommand 타입의 객체나 나온다. 나머진 API 문서 보면서 코딩.

이제 git clone으로 포크 기능 만들기에 필요한 기능은 확인이 됐는데... 이제부터가 시작이다.

만약에 포크하려는 이름의 프로젝트 이름이 이미 존재한다면? 프로젝트를 삭제하면 더 디렉토리도 잘 지워지나? 더 나가서는 100명이 포크따면 똑같은 워킹 디렉토리 100개 생기는건데 이건 어떻게하지? 그냥 그렇게 생기게 해야되는건가? 아니면 뭔가 중복되는 워킹 디렉토리 수를 줄일 수 있는 방법은 없을까? 등등 많지만.. 일단은 풀리퀘에 집중.

풀리퀘는 그럼 어떻게 구현할까나? 대충은 생각해봤지만 좀 더 정리해야되서 나중으로 미뤄야겠다.