포크

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

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

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

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

포크 만들기

  • GitLab 13.11에서 소개fork_project_form이라는 플래그를 사용한 새 양식.
  • GitLab 14.8에서 GitLab.com 및 자체 관리에서 활성화됨. 기능 플래그 fork_project_form이 제거됨.
  • GitLab 16.6에서 소개.

기존 GitLab 프로젝트를 포크하려면 다음을 수행하세요:

  1. 프로젝트의 홈페이지에서 오른쪽 상단에서 포크(Fork)를 선택합니다 ():

    프로젝트 포크

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

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

포크 업데이트

포크는 상위 저장소와 동기화되지 않을 수 있으며 업데이트가 필요할 수 있습니다: - 앞서: 포크에는 상위 저장소에 없는 새로운 커밋이 포함되어 있습니다. 포크를 동기화하려면 병함 요청을 만들어 변경 내용을 상위 저장소에 푸시하세요. - 뒤쳐: 상위 저장소에는 포크에 없는 새로운 커밋이 포함되어 있습니다. 포크를 동기화하려면 새로운 커밋을 포크에 풀어야 합니다. - 앞서 및 뒤쳐: 상위 저장소 및 포크에 모두 서로에 없는 새로운 커밋이 포함되어 있습니다. 포크를 완전히 동기화하려면 병합 요청을 만들어 변경 내용을 푸시하고 상위 저장소의 새 변경 내용을 포크에 풀어야 합니다.

포크를 상위 저장소와 동기화하려면 GitLab UI나 명령줄에서 업데이트하세요. GitLab 프리미엄 및 얼티메이트 티어에서는 상위 저장소를 품은 포크를 저장소 미러링으로 구성하여 업데이트를 자동화할 수 있습니다.

UI에서

  • GitLab 15.11에서 소개synchronize_fork이라는 플래그를 사용한 것.
  • GitLab 16.0에서 일반적으로 사용 가능. 기능 플래그 synchronize_fork이 제거됨.

전제 조건: - 포크는 상위 저장소의 보호되지 않은 브랜치에서 생성되어야 합니다.

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

  1. 왼쪽 사이드바에서 검색 또는 이동을 선택하세요.
  2. 내 모든 프로젝트 보기를 선택하세요.
  3. 업데이트하려는 포크를 선택하세요.
  4. 브랜치 이름의 드롭다운 목록 아래에서 포크가 상위 저장소보다 앞서거나 뒤척인지 확인할 수 있는 포크 출처 () 정보 상자를 찾습니다. 이 예에서 포크가 상위 저장소보다 뒤척입니다:

    상위 저장소에 앞서거나 뒤척인 일부 커밋을 포함하는 포크에 대한 정보 상자

  5. 만약 포크가 앞서 한 경우, 병합 요청 만들기를 선택하여 포크의 변경 내용을 상위 저장소에 추가하는 것을 제안합니다.
  6. 만약 포크가 뒤척일 경우, 포크 업데이트를 선택하여 상위 저장소에서 변경 사항을 풀어야 합니다.
  7. 포크가 앞서하고 뒤척일 경우, 병합 충돌이 감지되지 않는 경우에만 UI에서 포크를 업데이트할 수 있습니다:
    • 포크에 병합 충돌이 없는 경우, 병합 요청 생성를 선택하여 변경 내용을 상위 저장소에 푸시하는 것을 제안하거나, 포크 업데이트를 선택하여 포크로 변경 사항을 끌어들이거나, 둘 다를 선택하세요. 포크 내의 변경 유형에 따라 적절한 조치를 취합니다.
    • 포크에 병합 충돌이 있는 경우, 명령줄에서 포크를 업데이트하세요.

명령줄에서

명령줄에서 fork를 업데이트하려면 먼저 fork에 대한 upstream 원격 저장소가 구성되어 있는지 확인하세요:

  1. 아직 로컬로 fork를 복제하지 않은 경우에는 fork를 복제합니다. 자세한 내용은저장소 복제를 참조하십시오.
  2. fork에 구성된 원격 저장소를 확인합니다:

     git remote -v
    
  3. fork에 원본 저장소를 가리키는 원격이 없는 경우, 다음 예제 중 하나를 사용하여 upstream이라는 원격을 구성합니다:

     # <upstream_url>을(를) 편집한 후 해당 저장소를 upstream으로 설정하려면 이 줄을 사용하십시오
     git remote add upstream <upstream_url>
    
     # GitLab 메인 저장소를 upstream으로 설정하려면 이 줄을 사용하십시오
     git remote add upstream https://gitlab.com/gitlab-org/gitlab.git
    

    로컬 사본이 필요한 추가 원격이 구성되었는지 확인한 후 fork를 업데이트할 준비가 되었습니다.

  4. 로컬 사본에서 기본 브랜치를 확인하고, main을 기본 브랜치의 이름으로 바꿔치기합니다:

     git checkout main
    

    Git에서 스테이징되지 않은 변경 사항을 식별하면 계속하기 전에 커밋하거나 stash하세요.

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

     git fetch upstream
    
  6. fork에 변경 사항을 병합합니다. 업데이트하는 브랜치의 이름으로 main을 바꿔치기합니다:

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

     git push origin main
    

저장소 미러링 사용

세부정보: Tier: 프리미엄, 얼티메이트 Offering: GitLab.com, Self-managed, GitLab Dedicated

모든 이 조건을 충족하면 fork를 원본의 미러로 구성할 수 있습니다:

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

저장소 미러링은 fork를 원본 저장소와 동기화 상태로 유지합니다. 이 방법은 수동 git pull이 필요 없이 fork를 1시간마다 업데이트합니다. 지침은 Pull 미러링 구성을 읽으십시오.

경고: 미러링을 사용하면 병합 요청을 승인하기 전에 동기화 여부를 묻습니다. 자동화해야 합니다.

변경 사항을 원본으로 병합

원본 프로젝트로 코드를 보내려면, 병합 요청을 만듭니다. 소스 브랜치에 대해 fork된 프로젝트의 브랜치를 선택합니다. 대상 브랜치에는 원본 프로젝트의 브랜치를 선택합니다.

참고: 병합 요청을 만들 때, fork된 프로젝트의 가시성이 부모 프로젝트보다 제한적인 경우(예: fork는 비공개이지만 부모는 공개임), 대상 브랜치는 fork된 프로젝트의 기본 브랜치로 기본 설정됩니다. 이를 통해 fork된 프로젝트의 비공개 코드가 노출되는 것을 방지합니다.

브랜치 선택

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

fork의 연결 해제

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

전제 조건: - fork를 제거하려면 프로젝트 소유자여야 합니다.

경고: fork 관계를 제거하면 소스로 병합 요청을 보낼 수 없게 됩니다. 누군가가 여러분의 프로젝트를 fork했다면 그 fork도 관계가 끊깁니다. fork 관계를 복원하려면 API를 사용하세요.

fork 관계를 제거하려면:

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

hashed storage pool을 사용하여 fork의 객체를 다른 저장소와 공유하는 경우 fork 관계를 제거하면:

  • 모든 객체가 풀에서 fork로 복사됩니다.
  • 복사 프로세스가 완료되면 더 이상 저장소의 풀에서 fork로 업데이트되지 않습니다.

관련 주제

문제 해결

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

포크된 프로젝트와 새 네임스페이스 사이에 인스턴스 러너 설정 불일치로 인한 오류일 수 있습니다. 더 많은 정보는 Forks 섹션의 Runner 문서를 참조하세요.

포크 관계 제거가 실패하는 경우

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

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