Fork(포크)
가능한 경우 공통 Git 리포지터리에서 작업하고 작업을 관리하기 위해 브랜치 전략을 사용하는 것이 좋습니다. 그러나, 원하는 리포지터리에 대한 쓰기 액세스 권한이 없는 경우 포크를 생성할 수 있습니다.
포크는 선택한 네임스페이스에 생성하는 리포지터리 및 해당 모든 브랜치의 개인 복사본입니다. 포크된 프로젝트에서 변경 사항을 가하고 해당 변경 사항을 Merge Request을 통해 액세스할 수 없는 리포지터리에 제출합니다.
포크된 프로젝트는 중복 제거 전략을 사용하여 원본 프로젝트보다 작은 저장 공간을 가질 수 있습니다. 포크된 프로젝트는 원본 프로젝트에 연결된 객체 풀에 액세스할 수 있습니다.
포크 생성
- GitLab 13.11에서 도입됨 플래그
fork_project_form
으로 새 양식 도입. 기본적으로 비활성화됨.- GitLab 14.8에서 GitLab.com 및 Self-managed에서 활성화됨. 플래그
fork_project_form
제거.- GitLab 16.6에서 도입됨.
GitLab에서 기존 프로젝트를 포크하려면:
-
프로젝트의 홈페이지에서 오른쪽 상단에 있는 Fork (포크)를 선택합니다:
- 선택 사항. 프로젝트 이름을 편집합니다.
- 프로젝트 URL에서 포크를 만들 네임스페이스를 선택합니다.
- 프로젝트 슬러그를 추가합니다. 이 값은 포크의 URL의 일부가 됩니다. 네임스페이스 내에서 고유해야 합니다.
- 선택 사항. 프로젝트 설명을 추가합니다.
-
포함할 브랜치 옵션 중 하나를 선택합니다:
- 모든 브랜치 (기본값).
-
기본 브랜치만.
--single-branch
및--no-tags
Git 옵션을 사용합니다.
- 포크의 가시성 수준을 선택합니다. 가시성 수준에 대한 자세한 정보는 프로젝트 및 그룹 가시성을 읽어보세요.
- 프로젝트 포크를 선택합니다.
GitLab이 포크를 만들고 새로운 포크 페이지로 리디렉션합니다.
포크 업데이트
포크는 상위 리포지터리와 동기화되지 않을 수 있으며 업데이트가 필요할 수 있습니다.
- 앞서: 포크에는 상위 리포지터리에 없는 새로운 커밋이 포함되어 있습니다. 포크를 동기화하려면 변경 사항을 상위 리포지터리에 푸시하기 위해 Merge Request을 만듭니다.
- 뒤쳐짐: 상위 리포지터리에는 포크에 없는 새로운 커밋이 포함되어 있습니다. 포크를 동기화하려면 새 커밋을 포크로 가져와야 합니다.
- 앞서 있으며 뒤쳐짐: 상위 리포지터리와 포크에는 서로에 없는 새로운 커밋이 포함되어 있습니다. 포크를 완전히 동기화하려면 변경 사항을 상위 리포지터리에 푸시하고 상위 리포지터리의 새로운 변경 사항을 포크로 가져와야 합니다.
포크를 상위 리포지터리로 동기화하려면 GitLab UI나 명령줄을 사용하여 업데이트합니다. GitLab Premium 및 Ultimate 티어는 또한 상위 리포지터리의 포크를 리포지터리 미러링으로 구성하여 자동화할 수 있습니다.
UI에서
- GitLab 15.11에서 도입됨 플래그
synchronize_fork
으로 새 양식 도입. 기본적으로 비활성화되었지만gitlab-org/gitlab
및gitlab-com/www-gitlab-com
네임스페이스의 프로젝트에 대해 활성화됨.- GitLab 16.0에서 일반적으로 이용 가능. 플래그
synchronize_fork
제거.
전제 조건:
- 포크는 상위 리포지터리의 보호되지 않은 브랜치에서 생성되어야 합니다.
GitLab UI에서 포크를 업데이트하려면:
- 왼쪽 사이드바에서 검색 또는 이동을 선택합니다.
- 내 모든 프로젝트 보기를 선택합니다.
- 업데이트하려는 포크를 선택합니다.
-
브랜치 이름의 드롭다운 디렉터리 아래에서 포크됨 ({포크}) 정보 상자를 찾아 포크가 앞뒤로 밀린지 확인합니다. 이 예에서 포크가 상위 리포지터리에 뒤쳐짐을 나타내는 상태입니다:
- 만약 포크가 앞서 있으면, 포크의 변경 사항을 상위 리포지터리에 추가하기 위해 Merge Request 작성을 선택합니다.
- 만약 포크가 뒤쳐짐을 보이면, 새로운 커밋을 포크로 가져오기 위해 포크 업데이트를 선택합니다.
- 포크가 앞서 있고 뒤쳐짐을 보이면, Merge 충돌이 감지되지 않은 경우에만 UI에서 포크를 업데이트할 수 있습니다:
- 포크에 Merge 충돌이 없으면 Merge Request 작성을 선택하여 포크의 변경 사항을 상위 리포지터리에 추가하거나 포크 업데이트를 선택하여 포크로 새로운 변경 사항을 가져오거나 둘 다 모두 할 수 있습니다. 포크의 변경 사항의 종류에 따라 적절한 작업이 결정됩니다.
- 포크에 Merge 충돌이 있으면 명령줄에서 포크를 업데이트합니다.
명령줄에서
명령줄에서 포크를 업데이트하려면, 먼저 포크에 대해 upstream
원격 리포지터리가 구성되어 있는지 확인합니다:
- 이미 로컬로 포크를 클론하지 않은 경우, 리포지터리 클론을 참조하여 로컬에 포크를 클론합니다.
-
포크에 구성된 원격 리포지터리를 확인합니다:
git remote -v
-
포크에 원본 리포지터리를 가리키는 원격이 설정되어 있지 않다면, 다음 예제 중 하나를 사용하여
upstream
이라는 원격을 구성합니다:# <upstream_url>을(를) 편집한 후, 이 명령을 사용하여 모든 리포지터리를 상위 리포지터리로 설정할 수 있습니다 git remote add upstream <upstream_url> # GitLab의 주요 리포지터리를 상위 리포지터리로 설정하려면 이 명령을 사용합니다 git remote add upstream https://gitlab.com/gitlab-org/gitlab.git
로컬 사본이 원격을 추가한 후에 포크를 업데이트할 준비가 되었습니다.
-
로컬 사본에서 기본 브랜치를 체크아웃합니다. 기본 브랜치의 이름으로
main
을 대체합니다:git checkout main
Git이 스테이지에 올라가지 않은 변경 사항을 식별하면 계속하기 전에 커밋하거나 stash하세요.
-
상위 리포지터리의 변경 사항을 가져옵니다:
git fetch upstream
-
변경 사항을 포크로 가져오는데 사용할 브랜치의 이름으로
main
을 대체하여 변경 사항을 포크로 가져옵니다:git pull upstream main
-
변경 사항을 서버(GitLab.com 또는 직접 관리하는)에 있는 포크 리포지터리로 푸시합니다:
git push origin main
리포지터리 미러링으로
모든 조건이 충족되면 포크를 업스트림의 미러로 구성할 수 있습니다:
- 구독이 Premium 또는 Ultimate 여야 합니다.
- 모든 변경 사항을 브랜치(
main
이 아님)에서 생성합니다. -
main
에 변경 사항이 필요한 기밀 이슈에 대한 Merge Request에서 작업하지 않습니다.
리포지터리 미러링을 사용하면 포크가 원본 리포지터리와 동기화됩니다.
이 방법은 매 시간마다 포크를 업데이트하며 매뉴얼 git pull
이 필요하지 않습니다.
지침은 풀 미러링 구성을 참조하세요.
변경 사항을 상류로 Merge하기
코드를 상류 프로젝트에 다시 보내려면 Merge Request을 생성하세요. 소스 브랜치에서는 포크된 프로젝트의 브랜치를 선택하고, 대상 브랜치에서는 원래 프로젝트의 브랜치를 선택하세요.
그런 다음 라벨, 마일스톤을 추가하고, 변경 사항을 검토할 수 있는 담당자에게 Merge Request을 할당하세요. 그런 다음 Merge Request 제출을 선택하여 프로세스를 완료하세요. 성공적으로 Merge된 경우, 변경 사항은 리포지터리와 Merge 중인 브랜치에 추가됩니다.
포크 링크 해제
포크 관계를 제거하면 포크가 상류 프로젝트와 연결이 끊깁니다. 포크는 그 후 독립 프로젝트가 됩니다.
전제 조건:
- 포크를 해제하려면 프로젝트 소유자여야 합니다.
포크 관계를 제거하려면:
- 왼쪽 사이드바에서 검색 또는 이동을 선택하여 프로젝트를 찾습니다.
- 설정 > 일반을 선택합니다.
- 고급을 확장합니다.
- 포크 관계 제거 섹션에서 포크 관계 제거를 선택합니다.
- 확인을 위해 프로젝트 경로를 입력하고 확인을 선택합니다.
해시가 적용된 리포지터리 풀을 사용하는 포크를 해제할 때:
- 모든 객체가 풀에서 포크로 복사됩니다.
- 복사 프로세스가 완료된 후에는 리포지터리 풀에서 포크로 업데이트되는 것은 더 이상 없습니다.
관련 주제
- GitLab 커뮤니티 포럼: 포크 새로고침
문제 해결
오류: 프로젝트를 포킹하는 중 오류가 발생했습니다. 다시 시도해주세요
이 오류는 포킹된 프로젝트와 새 네임스페이스 사이의 인스턴스 러너 설정 불일치로 인한 것입니다. 자세한 내용은 러너 설명서의 Forks를 참조하세요.
포크 관계 제거 실패
UI 또는 API를 통한 포크 제거가 작동하지 않는 경우, Rails 콘솔 세션에서 포크 관계 해제를 시도할 수 있습니다:
p = Project.find_by_full_path('<project_path>')
u = User.find_by_username('<username>')
Projects::UnlinkForkService.new(p, u).execute