포크

Tier: Free, Premium, Ultimate Offering: GitLab.com, Self-managed, GitLab Dedicated

가능한 경우, 일반 Git 리포지토리에서 작업하고 브랜치 전략을 사용하여 작업을 관리하는 것이 좋습니다.

그러나 기여하고자 하는 리포지토리에 대한 쓰기 권한이 없는 경우에는 포크를 만들 수 있습니다.

포크는 선택한 네임스페이스에 생성한 리포지토리 및 모든 브랜치의 개인 사본입니다. 자신만의 포크에서 변경을 하고,

접근할 수 없는 리포지토리에 대한 병합 요청을 제출합니다.

포크된 프로젝트는 소스 프로젝트보다 잠재적으로 더 작을 수 있는 저장 공간을 확보하기 위해

중복 제거 전략을 사용합니다. 포크된 프로젝트는 소스 프로젝트와 연결된 객체 풀에 접근할 수 있습니다.

포크 만들기

  • GitLab 16.6에 도입됨.

기존 프로젝트를 GitLab에서 포크하려면:

  1. 프로젝트 홈 페이지의 오른쪽 상단에서 Fork ( )를 선택합니다.
  2. 선택 사항입니다. 프로젝트 이름을 수정합니다.
  3. 프로젝트 URL에서 포크가 속해야 하는 네임스페이스를 선택합니다.
  4. 프로젝트 슬러그를 추가합니다. 이 값은 포크의 URL의 일부가 됩니다.
    네임스페이스 내에서 고유해야 합니다.
  5. 선택 사항입니다. 프로젝트 설명을 추가합니다.
  6. 포함할 브랜치 옵션 중 하나를 선택합니다:
    • 모든 브랜치 (기본값).
    • 기본 브랜치만. --single-branch--no-tags를 사용합니다.
      Git 옵션.
  7. 포크의 가시성 수준을 선택합니다. 가시성 수준에 대한 자세한 내용은 프로젝트 및 그룹 가시성을 읽어보세요.
  8. 포크 프로젝트를 선택합니다.

GitLab이 포크를 생성하고, 새로운 포크의 페이지로 리디렉션합니다.

포크 업데이트

포크는 업스트림 리포지토리와 동기화가 되지 않을 수 있으며 업데이트가 필요합니다:

  • 앞서 있음: 포크에는 업스트림 리포지토리에 없는 새로운 커밋이 포함되어 있습니다.
    포크를 동기화하려면, 변경 내용을 업스트림 리포지토리로 푸시하기 위해 병합 요청을 생성합니다.
  • 뒤에 있음: 업스트림 리포지토리에 포크에 없는 새로운 커밋이 포함되어 있습니다.
    포크를 동기화하려면, 새로운 커밋을 포크로 가져옵니다.
  • 앞서 있고 뒤에 있음: 업스트림 리포지토리와 포크 모두 서로 없는 새로운 커밋을 포함하고 있습니다.
    포크를 완전히 동기화하려면, 변경 사항을 푸시하기 위해 병합 요청을 생성하고, 업스트림 리포지토리의 새로운 변경 사항을 포크로 가져옵니다.

GitLab UI 또는 커맨드 라인에서 포크를 업스트림 리포지토리와 동기화하려면, 업데이트합니다. GitLab Premium 및 Ultimate 티어는 또한 업스트림 리포지토리의 풀 미러로 포크를 구성하여 자동 업데이트할 수 있습니다.

UI에서

  • GitLab 15.11에서 플래그 synchronize_fork와 함께 도입됨.
    기본적으로 비활성화되어 있지만 gitlab-org/gitlabgitlab-com/www-gitlab-com 네임스페이스에 있는 프로젝트에 대해서만 활성화됩니다.
  • GitLab 16.0에서 일반적으로 사용 가능해졌습니다. 기능 플래그 synchronize_fork가 제거되었습니다.

사전 요구 사항:

GitLab UI에서 포크를 업데이트하려면:

  1. 왼쪽 사이드바에서 검색 또는 이동을 선택합니다.
  2. 내 모든 프로젝트 보기를 선택합니다.
  3. 업데이트하려는 포크를 선택합니다.
  4. 브랜치 이름 드롭다운 목록 아래에서, 포크가 앞서 있는지, 뒤에 있는지, 또는 둘 다인지를 확인하기 위해 Forked from ( ) 정보 상자를 찾습니다. 이 예에서는 포크가 업스트림 리포지토리보다 뒤에 있습니다:

    업스트림 리포지토리보다 커밋 몇 개가 뒤에 있는 포크에 대한 정보 상자

  5. 포크가 업스트림 리포지토리보다 앞서 있는 경우, 병합 요청 생성을 선택하여 포크의 변경 사항을 업스트림 리포지토리에 추가하자고 제안합니다.
  6. 포크가 업스트림 리포지토리에 뒤에 있는 경우, 포크 업데이트를 선택하여 업스트림 리포지토리에서 변경 사항을 가져옵니다.
  7. 포크가 업스트림 리포지토리에 앞서 있고 뒤에 있는 경우, 병합 충돌이 감지되지 않는 경우에만 UI에서 업데이트할 수 있습니다:
    • 포크에 병합 충돌이 없는 경우, 병합 요청 생성을 선택하여 업스트림 리포지토리에 변경 사항 푸시를 제안할 수 있으며, 포크 업데이트를 통해 변경 사항을 포크로 가져올 수 있습니다. 두 작업 모두 가능합니다. 포크 변경 사항의 유형에 따라 적절한 행동이 결정됩니다.
    • 포크에 병합 충돌이 있는 경우, 커맨드 라인에서 포크를 업데이트합니다.

명령줄에서

명령줄에서 포크를 업데이트하려면 먼저 포크를 위한 upstream 원격 저장소를 구성했는지 확인하세요:

  1. 로컬에서 포크를 클론합니다. 아직 하지 않았다면, 자세한 내용은 Git 저장소 클론하기를 참조하세요.

  2. 포크에 구성된 원격 설정을 확인합니다:

    git remote -v
    
  3. 포크에 원래 저장소를 가리키는 원격이 없다면, 다음 예시 중 하나를 사용하여 upstream이라는 원격을 구성합니다:

    # <upstream_url>를 편집한 후 이 줄을 사용하여 원격을 설정합니다
    git remote add upstream <upstream_url>
    
    # 이 줄을 사용하여 주요 GitLab 저장소를 원격으로 설정합니다
    git remote add upstream https://gitlab.com/gitlab-org/gitlab.git
    

    로컬 복사본에 추가 원격이 구성되어 있으면 포크를 업데이트할 준비가 되었습니다.

  4. 로컬 복사본에서 기본 브랜치를 체크아웃했는지 확인하고, main을 기본 브랜치의 이름으로 교체합니다:

    git checkout main
    

    Git이 스테이지되지 않은 변경 사항을 발견하면 계속하기 전에 커밋하거나 스태시합니다.

  5. upstream 저장소의 변경 사항을 가져옵니다:

    git fetch upstream
    
  6. 포크에 변경 사항을 당겨옵니다. main을 업데이트하고 있는 브랜치의 이름으로 교체합니다:

    git pull upstream main
    
  7. 서버(GitLab.com 또는 Self-managed)의 포크 저장소에 변경 사항을 푸시합니다:

    git push origin main
    

저장소 미러링으로

Tier: Premium, Ultimate

Offering: GitLab.com, Self-managed, GitLab Dedicated

포크는 모든 조건을 만족할 경우 upstream의 미러로 구성할 수 있습니다:

  1. 여러분의 구독이 Premium 또는 Ultimate입니다.

  2. 모든 변경 사항을 브랜치에서 만듭니다 (not main).

  3. 비밀 문제에 대한 병합 요청을 작업하지 않습니다, 이는 main에 변경이 필요합니다.

저장소 미러링은 포크를 원래 저장소와 동기화된 상태로 유지합니다. 이 방법은 manual git pull이 필요 없이 포크를 시간당 한 번 업데이트합니다. 지침은 푸시 미러링 구성하기를 읽으세요.

경고:

미러링으로 병합 요청을 승인하기 전에 동기화를 요청받습니다. 이를 자동화하는 것이 좋습니다.

변경 사항을 upstream으로 다시 병합하기

코드를 upstream 프로젝트로 보내기 준비가 되었다면, 병합 요청 만들기를 수행하세요. 소스 브랜치에는 포크한 프로젝트의 브랜치를 선택합니다. 대상 브랜치에는 원본 프로젝트의 브랜치를 선택합니다.

참고:

병합 요청을 생성할 때 포크한 프로젝트의 가시성이 부모 프로젝트보다 더 제한적이면(예: 포크가 비공개이고 부모가 공개임), 대상 브랜치는 기본적으로 포크 프로젝트의 기본 브랜치로 설정됩니다. 이는 포크한 프로젝트의 비공식 코드를 노출할 수 있는 잠재적인 위험을 방지합니다.

브랜치 선택하기

그런 다음 레이블, 마일스톤을 추가하고, 변경 사항을 검토할 수 있는 사람에게 병합 요청을 할당합니다. 그런 다음 병합 요청 제출을 선택하여 프로세스를 완료합니다. 성공적으로 병합되면 변경 사항이 병합 대상 저장소 및 브랜치에 추가됩니다.

포크 연결 해제

포크 관계를 제거하면 포크가 업스트림 프로젝트와 연결이 끊깁니다.

귀하의 포크는 독립적인 프로젝트가 됩니다.

필수 조건:

  • 포크를 해제하려면 프로젝트 소유자여야 합니다.

경고: 포크 관계를 제거하면 소스로 병합 요청을 보낼 수 없습니다.

누군가 귀하의 프로젝트를 포크한 경우, 그들의 포크도 관계를 잃게 됩니다.

포크 관계를 복원하려면, API를 사용하십시오.

포크 관계를 제거하려면:

  1. 왼쪽 사이드바에서 Search or go to를 선택하고 프로젝트를 찾습니다.

  2. Settings > General을 선택합니다.

  3. Advanced를 확장합니다.

  4. Remove fork relationship 섹션에서 Remove fork relationship을 선택합니다.

  5. 확인을 위해 프로젝트 경로를 입력하고 Confirm을 선택합니다.

해시 저장소 풀을 사용하는 포크의 연결을 끊으면 hashed storage pool와 다른 저장소에서 객체를 공유하는 경우:

  • 모든 객체가 풀에서 귀하의 포크로 복사됩니다.

  • 복사 프로세스가 완료된 후, 저장소 풀의 추가 업데이트는 귀하의 포크에 전파되지 않습니다.

관련 주제

문제 해결

오류: An error occurred while forking the project. Please try again

이 오류는 포크된 프로젝트와 새로운 네임스페이스 간의 인스턴스 러너 설정 불일치로 인해 발생할 수 있습니다.

자세한 내용은 러너 문서의 Forks를 참조하십시오.

포크 관계 제거 실패

UI 또는 API를 통해 포크를 제거할 수 없는 경우, Rails 콘솔 세션에서 포크 관계 제거를 시도할 수 있습니다:

p = Project.find_by_full_path('<project_path>')
u = User.find_by_username('<username>')
Projects::UnlinkForkService.new(p, u).execute