フォーク
- プラン: Free、Premium、Ultimate
- 提供形態: GitLab.com、GitLab Self-Managed、GitLab Dedicated
フォークとは、別のGitリポジトリの個人用コピーであり、選択したネームスペースに配置されます。コピーには、すべてのブランチ、タグ、CI/CDジョブ設定など、アップストリームリポジトリのコンテンツが含まれています。フォークからマージリクエストを作成して、アップストリームリポジトリをターゲットにすることができます。個々のコミットをフォークからアップストリームリポジトリにcherry-pickすることもできます。
元のリポジトリへの書き込みアクセス権がある場合、フォークは必要ありません。代わりに、ブランチを使用して作業を管理します。コントリビュートしたいリポジトリへの書き込みアクセス権がない場合は、フォークしてください。フォークに変更を加え、マージリクエストを通じてアップストリームリポジトリに送信します。
機密マージリクエストを作成するには、公開リポジトリの個人用フォークを使用します。
アップストリームプロジェクトがアーカイブされている場合、フォーク関係は自動的に削除されます。フォーク関係の破損により完了したマージリクエストは、フォーク関係が後で復元されても再度開かれることはありません。
詳細については、プロジェクトのアーカイブを参照してください。
フォークを作成する
GitLabで既存のプロジェクトをフォークするには:
- プロジェクトのホームページの右上隅で、フォーク( )を選択します。
- オプション。プロジェクト名を編集します。
- プロジェクトのURLで、フォークの所属先のネームスペースを選択します。
- プロジェクトslugを追加します。この値は、フォークへのURLの一部になります。ネームスペース内で一意である必要があります。
- オプション。プロジェクトの説明を追加します。
- 含めるブランチオプションのいずれかを選択します:
- すべてのブランチ(デフォルト)。
- Only the default branch(デフォルトブランチのみ)。
--single-branchおよび--no-tagsGitオプションを使用します。
- フォークの表示レベルを選択します。表示レベルの詳細については、プロジェクトとグループの表示をお読みください。
- プロジェクトをフォークを選択します。
GitLabはフォークを作成し、新しいフォークのページにリダイレクトし、フォークの作成を監査ログに記録します。
変更を頻繁にアップストリームにコントリビュートする場合は、フォークのデフォルトターゲットを設定することを検討してください。
フォークを更新する
フォークはアップストリームリポジトリとの同期がずれ、更新が必要になる場合があります:
- Ahead(進んでいる): フォークには、アップストリームリポジトリに存在しない新しいコミットが含まれています。フォークを同期するには、マージリクエストを作成して、変更をアップストリームリポジトリにプッシュします。
- Behind(遅れている): アップストリームリポジトリには、フォークに存在しない新しいコミットが含まれています。フォークを同期するには、新しいコミットをフォークにプルします。
- Ahead and behind(進んでいて、遅れている): アップストリームリポジトリとフォークの両方に、もう一方に存在しない新しいコミットが含まれています。フォークを完全に同期するには、マージリクエストを作成して変更をプッシュし、アップストリームリポジトリの新しい変更をフォークにプルします。
フォークをそのアップストリームリポジトリと同期するには、GitLab UIまたはコマンドラインから更新します。GitLab PremiumおよびUltimateプランでは、アップストリームリポジトリのプルミラーとしてフォークを設定して、更新を自動化することもできます。
UIから
UIからフォークを更新すると、フォーク上の次のリポジトリ保護設定は回避されます:
- フォークで設定されたプッシュルール。
- フォーク内のファイルに適用されるファイルのロック。
この動作により、アップストリームプロジェクトとフォークで保護設定が異なる場合に、同期の失敗を防ぎます。同期プロセスは、アップストリームプロジェクトから変更をプルし、それらをフォークに直接適用します。
前提要件:
- アップストリームリポジトリの保護されていないブランチからフォークを作成する必要があります。
GitLab UIからフォークを更新するには:
左側のサイドバーで、検索または移動先を選択します。
すべてのプロジェクトを表示を選択します。
更新するフォークを選択します。
ブランチ名のドロップダウンリストの下にあるフォーク元:( )情報ボックスで、フォークが進んでいるか、遅れているか、またはその両方であるかを確認します。この例では、フォークはアップストリームリポジトリよりも遅れています:
フォークがアップストリームリポジトリよりもahead(進んでいる)場合は、マージリクエストを作成を選択して、フォークの変更をアップストリームリポジトリに追加することを提案します。
フォークがアップストリームリポジトリよりもbehind(遅れている)場合は、フォークを更新を選択して、アップストリームリポジトリから変更をプルします。
フォークがアップストリームリポジトリよりもahead and behind(進んでいて、遅れている)場合、GitLabがマージコンフリクトを検出しない場合にのみ、UIから更新できます:
- フォークにマージコンフリクトが含まれていない場合は、マージリクエストを作成を選択して、フォークの変更をアップストリームリポジトリにプッシュすること、フォークを更新して変更をフォークにプルすること、またはその両方を行うことを提案できます。フォーク内の変更のタイプによって、どの操作が適切かが決まります。
- フォークにマージコンフリクトが含まれている場合、GitLabはコマンドラインからフォークを更新するための段階的なガイドを表示します。
コマンドラインから
コマンドラインからフォークを更新することもできます。
前提要件:
- ローカルマシンにGitクライアントをダウンロードしてインストールする必要があります。
- 更新するリポジトリのフォークを作成する必要があります。
コマンドラインからフォークを更新するには、Gitを使用してフォークを更新するの手順に従ってください。
リポジトリのミラーリングを使用する
- プラン: Premium、Ultimate
- 提供形態: GitLab.com、GitLab Self-Managed、GitLab Dedicated
次のすべての条件が満たされている場合、フォークはアップストリームのミラーとして設定できます:
- サブスクリプションがGitLab PremiumまたはGitLab Ultimateである。
- すべての変更をブランチ(
mainではなく)で作成する。 - 機密イシューのマージリクエストでは作業しない。これには、
mainへの変更が必要です。
リポジトリのミラーリングは、フォークを元のリポジトリと同期した状態に保ちます。この方法では、手動でgit pullを実行する必要はなく、1時間に1回フォークが更新されます。手順については、プルミラーリングの設定をお読みください。
ミラーリングでは、マージリクエストを承認する前に、同期を求められます。自動化する必要があります。
変更をアップストリームにマージする
コードをアップストリームリポジトリに送り返す準備ができたら、フォークで作業する場合の説明に従って、新しいマージリクエストを作成します。正常にマージされると、変更はマージ先のリポジトリとブランチに追加されます。
マージリクエストがアップストリームにマージされた後、フォーク内のブランチは、一括削除の目的で自動的にマージ済みとは見なされません。ブランチは、フォークのデフォルトのブランチにこれらの変更が含まれている場合にのみ、マージ済みと見なされます。これらのブランチをフォークでマージ済みとしてマークするには、フォークを更新して、アップストリームリポジトリと同期します。
フォークのリンクを解除する
フォーク関係を削除すると、フォークとそのアップストリームリポジトリとのリンクが解除されます。フォークはその後、独立したリポジトリになります。
前提要件:
- フォークのリンクを解除するには、プロジェクトオーナーである必要があります。
フォーク関係を削除すると、新しいマージリクエストをソースに送信できなくなります。フォークからソースへの既存のオープンマージリクエストも完了します。誰かがリポジトリをフォークした場合、そのフォークも関係を失います。フォーク関係を復元するには、APIを使用します。
フォーク関係を削除するには:
- 左側のサイドバーで、検索または移動先を選択して、プロジェクトを見つけます。
- 設定 > 一般を選択します。
- 高度な設定を展開します。
- フォークの関係を削除セクションで、フォークの関係を削除を選択します。
- 確認するには、プロジェクトパスを入力し、確認を選択します。
GitLabは、リンク解除操作を監査ログに記録します。ハッシュストレージプールを使用して別のリポジトリとオブジェクトを共有するフォークのリンクを解除すると:
- すべてのオブジェクトがプールからフォークにコピーされます。
- コピープロセスが完了すると、ストレージプールからのそれ以上の更新はフォークに反映されません。
フォークのストレージ使用量を確認する
フォークは重複排除ストラテジを使用して、必要なストレージスペースを削減します。フォークは、ソースリポジトリに接続されているオブジェクトプールにアクセスできます。
詳細およびストレージの使用状況の確認については、プロジェクトフォークストレージの使用状況を表示を参照してください。
関連トピック
- GitLabコミュニティフォーラム: フォークの更新
- グループ外でのプロジェクトのフォークを防止
- Git LFSはフォークでどのように機能するのか
トラブルシューティング
エラー: An error occurred while forking the project. Please try again
このエラーは、フォークされたプロジェクトと新しいネームスペースの間でインスタンスRunnerの設定が一致しないことが原因である可能性があります。詳細については、Runnerドキュメントのフォークを参照してください。
フォーク関係の削除に失敗する
UIまたはAPIを使用してフォークを削除できない場合は、Railsコンソールセッションでフォーク関係の削除を試みることができます:
p = Project.find_by_full_path('<project_path>')
u = User.find_by_username('<username>')
Projects::UnlinkForkService.new(p, u).execute