포크

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

가능한 경우 공통 Git 리포지터리에서 작업하고 작업을 관리하기 위해 브랜치 전략을 사용하는 것이 좋습니다. 그러나 기여하려는 리포지터리에 대한 쓰기 액세스 권한이 없는 경우 포크를 생성할 수 있습니다.

포크는 선택한 네임스페이스에 생성하는 리포지터리와 해당 리포지터리의 모든 브랜치의 개인 복사본입니다. 개인 포크에서 변경 사항을 만들고 그 변경 사항을 Merge Request을 통해 액세스할 수 없는 리포지터리에 제출하세요.

포크된 프로젝트는 중복 제거 전략 을 사용하여 소스 프로젝트보다 잠재적으로 작은 저장 공간을 가집니다. 포크된 프로젝트는 소스 프로젝트에 연결된 개체 풀에 액세스할 수 있습니다.

포크 만들기

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

  1. 프로젝트의 홈페이지에서 오른쪽 상단에서 Fork ()를 선택하세요:

    이 프로젝트를 포크

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

GitLab은 포크를 만들고 새 포크 페이지로 리디렉션합니다.

포크 업데이트

포크는 상류 리포지터리와 동기화가 끊길 수 있으며 업데이트가 필요할 수 있습니다.

  • 앞서: 포크에는 상류 리포지터리에 없는 새 커밋이 포함되어 있습니다. 포크를 동기화하려면 Merge Request을 만들어 변경 사항을 상류 리포지터리에 푸시하세요.
  • 뒤쳐: 상류 리포지터리에는 포크에 없는 새 커밋이 포함되어 있습니다. 포크를 동기화하려면 새 커밋을 포크로 가져와야 합니다.
  • 앞서 및 뒤쳐: 상류 리포지터리와 포크에 모두 없는 새 커밋이 포함되어 있습니다. 포크를 완전히 동기화하려면 변경 사항을 상류 리포지터리에 푸시하고 상류 리포지터리의 새 변경 사항을 포크로 가져와야 합니다.

포크를 상류 리포지터리와 동기화하려면 GitLab UI 또는 명령줄에서 업데이트합니다. GitLab Premium 및 Ultimate 티어는 상류 리포지터리를 리포지터리 미러링으로 구성하여 업데이트를 자동화할 수도 있습니다.

UI에서

전제 조건:

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

  1. 왼쪽 사이드바에서 검색 또는 이동을 선택하세요.
  2. 내 모든 프로젝트 보기를 선택하세요.
  3. 업데이트하려는 포크를 선택하세요.
  4. 브랜치 이름의 드롭다운 디렉터리 아래에서 Forked from () 정보 상자를 찾아 포크가 앞서거나 뒤쳐 있는지 결정합니다. 이 예제에서는 포크가 상류 리포지터리에 뒤처져 있는 것을 나타냅니다.

    상류 리포지터리에 몇 개의 커밋이 빠진 포크에 대한 정보 상자

  5. 포크가 앞서 상위 리포지터리에서 뒷서 있다면, 포크의 변경 사항을 상위 리포지터리에 추가하는 Merge Request을 제안하려면 Merge Request 만들기를 선택하세요.
  6. 포크가 상위 리포지터리에서 뒤쳐 있다면, 포크 업데이트를 선택하여 상위 리포지터리에서 변경 사항을 가져옵니다.
  7. 포크가 상위 리포지터리에서 앞서고 뒤쳐 있다면 Merge 충돌이 없는 경우에만 사용 가능한 UI에서 업데이트합니다:
    • 포크에 Merge 충돌이 없는 경우, 상위 리포지터리에 변경 사항을 푸시하거나 포크로 변경 사항을 가져오거나 둘 다를 선택할 수 있습니다. 포크의 변경 사항의 유형에 따라 적절한 작업이 결정됩니다.
    • 포크에 Merge 충돌이 있는 경우 명령줄에서 포크를 업데이트하세요.

명령줄에서

명령줄에서 포크를 업데이트하려면 먼저 포크에 대해 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. 상위 리포지터리의 변경 사항을 가져옵니다:

    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

포크는 다음 조건을 모두 충족하면 상류의 미러로 구성할 수 있습니다:

  1. 구독한 사용자가 Premium 또는 Ultimate 티어를 사용해야 합니다.
  2. 모든 변경 사항을 브랜치(기본값이 아님)에서 만들어야 합니다.
  3. 기밀 문제에 대한 Merge Request을 위한 작업을 수행하면 안 됩니다. 이 경우 main에 변경 사항이 필요합니다.

리포지터리 미러링은 포크를 원본 리포지터리와 동기화합니다. 이 방법은 매뉴얼 git pull이 필요 없이 한 시간에 한번 포크를 업데이트합니다. 지침은 풀 미러링 구성을 읽어보세요.

caution
미러링으로 Merge Request을 승인하기 전에 동기화를 요청합니다. 자동화해야 합니다.

상류로 변경 사항을 Merge합니다

코드를 상류 프로젝트로 다시 보내려면, Merge Request을 생성하세요. 소스 브랜치에는 fork된 프로젝트의 브랜치를 선택하고, 대상 브랜치에는 원래 프로젝트의 브랜치를 선택하세요.

note
Merge Request을 생성할 때, fork된 프로젝트의 가시성이 상위 프로젝트보다 제한적인 경우(예: fork가 비공개이고, 상위 프로젝트가 공개인 경우) 대상 브랜치는 fork된 프로젝트의 기본 브랜치로 기본 설정됩니다. 이렇게 함으로써 fork된 프로젝트의 비공개 코드를 잠재적으로 노출하는 것을 방지합니다.

브랜치 선택

그런 다음 레이블, 마일스톤을 추가하고 변경 사항을 검토할 수 있는 사람에게 Merge Request을 할당하세요. 그런 다음 Merge Request 제출을 선택하여 프로세스를 완료하세요. 성공적으로 Merge되면 변경 사항이 리포지터리와 Merge 중인 브랜치에 추가됩니다.

fork 해제하기

fork 관계를 제거하면 fork가 상류 프로젝트와의 연결이 끊깁니다. 그럼 fork는 독립 프로젝트가 됩니다.

전제 조건:

  • fork를 해제하려면 프로젝트 소유자여야 합니다.
caution
fork 관계를 제거하면 소스로부터 Merge Request을 보낼 수 없게 됩니다. 만약 누군가가 여러분의 프로젝트를 fork했다면, 그들의 fork도 연결이 끊기게 됩니다. fork 관계를 복원하려면 API를 사용하세요.

fork 관계를 제거하려면:

  1. 왼쪽 사이드바에서 검색 또는 이동을 선택하여 프로젝트를 찾습니다.
  2. 설정 > 일반을 선택합니다.
  3. 고급을 확장합니다.
  4. fork 관계 제거 섹션에서 fork 관계 제거를 선택합니다.
  5. 확인하려면 프로젝트 경로를 입력하고 확인을 선택합니다.

hashed storage pool을 사용하여 fork를 unlink하는 경우:

  • 모든 객체가 풀에서 fork로 복사됩니다.
  • 복사 프로세스가 완료된 후에는 리포지터리 풀에서 fork로의 추가 업데이트가 전파되지 않습니다.

관련 주제

문제 해결

오류: 프로젝트를 fork하는 동안 오류가 발생했습니다. 다시 시도하십시오

이 오류는 fork된 프로젝트와 새 네임스페이스 간의 인스턴스 runner 설정 불일치로 인해 발생할 수 있습니다. 더 많은 정보는 Runner documentation에서 확인할 수 있습니다.

fork 관계 제거 실패

UI 또는 API를 통한 fork 제거가 작동하지 않는 경우, fork 관계 제거를 시도할 수 있습니다. Rails 콘솔 세션에서 fork 관계 제거를 시도하세요:

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