Fork (포크)

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

가능한 경우 공통 Git 저장소에서 작업하고 작업을 관리하기 위해 브랜치 전략을 사용하는 것이 좋습니다. 그러나, 기여하고자 하는 저장소에 대한 쓰기 액세스가 없는 경우 포크를 만들 수 있습니다.

포크는 선택한 네임스페이스에 생성하는 저장소와 해당 저장소의 모든 브랜치의 개인 복사본입니다. 자신의 포크에서 변경하고 해당 내용을 병합 요청을 통해 액세스할 수 없는 저장소에 제출할 수 있습니다.

포크된 프로젝트는 원본 프로젝트보다 잠재적으로 더 작은 저장 공간을 가지도록 중복 제거 전략을 사용합니다. 포크된 프로젝트는 원본 프로젝트에 연결된 객체 풀에 액세스할 수 있습니다.

포크 만들기

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>
    
    # 주 저장소를 원격 저장소로 설정하려면 이 라인을 사용합니다
    git remote add upstream https://gitlab.com/gitlab-org/gitlab.git
    

    로컬 사본이 구성된 리모트가있는 경우 포크를 업데이트할 준비가 된 것입니다.

  4. 로컬 사본에서 기본 브랜치를 확인합니다. 기본 브랜치의 이름으로 main을 대체합니다:

    git checkout main
    

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

  5. 상위 저장소에서 변경 사항을 가져옵니다:

    git fetch upstream
    
  6. 포크에 변경 사항을 풀어서 사용 중인 브랜치의 이름으로 대체합니다:

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

    git push origin main
    

저장소 미러링과 함께

Tier: 프리미엄, 얼티메이트 Offering: GitLab.com, 온프레미스, GitLab Dedicated

모든 다음 조건을 충족하는 경우에 포크를 상위스트림의 미러로 구성할 수 있습니다.

  1. 구독이 프리미엄 또는 얼티메이트여야 합니다.
  2. 모든 변경 사항을 브랜치(‘main’이 아님)에서 만들어야 합니다.
  3. main에 변경 사항이 필요한 기밀 문제에 대한 병합 요청에서 작업하면 안 됩니다.

저장소 미러링을 통해 포크가 원본 저장소와 동기화됩니다. 이 방법은 매 시간마다 포크를 업데이트하며, 수동 git pull이 필요하지 않습니다. 지침은 풀 미러링 구성을 읽어보세요.

경고: 미러링을 사용할 경우, 병합 요청을 승인하기 전에 동기화하라는 메시지가 표시됩니다. 자동화해야 합니다.

상류로 변경 사항 병합

코드를 상류 프로젝트로 보내려면 병합 요청을 생성하세요. 소스 브랜치에는 포크된 프로젝트의 브랜치를, 대상 브랜치에는 원본 프로젝트의 브랜치를 선택하세요.

참고: 병합 요청을 생성할 때, 포크된 프로젝트의 가시성이 상위 프로젝트보다 제한적인 경우(예: 포크는 비공개이고 부모는 공개인 경우), 대상 브랜치는 포크된 프로젝트의 기본 브랜치로 기본설정됩니다. 이로써 포크된 프로젝트의 비공개 코드가 노출되지 않도록 방지합니다.

브랜치 선택

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

포크 관계를 제거하면 포크가 원본 프로젝트와의 연결이 끊기게 됩니다. 그러면 포크는 독립된 프로젝트가 됩니다.

전제 조건:

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

경고: 포크 관계를 제거하면 소스에 병합 요청을 보낼 수 없게 됩니다. 누군가가 귀하의 프로젝트를 포크한 경우, 그들의 포크도 관련성이 사라집니다. 포크 관계를 복원하려면 API를 사용하세요.

포크 관계를 제거하려면:

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

다른 저장소와 객체를 공유하기 위해 해시 저장소 풀을 사용하는 포크를 unlink 하는 경우:

  • 모든 객체가 풀에서 귀하의 포크로 복사됩니다.
  • 복사 프로세스가 완료되면 저장소 풀에서 귀하의 포크로의 추가 업데이트는 전파되지 않습니다.

관련 주제

문제 해결

오류: 프로젝트를 포크하는 동안 오류가 발생했습니다. 다시 시도하세요

이 오류는 포크된 프로젝트와 새 네임스페이스 간의 인스턴스 러너 설정 불일치로 인해 발생할 수 있습니다. 자세한 내용은 러너 문서의 포크를 참조하세요.

포크 관계 제거 실패

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

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