フォーク
- プラン: Free、Premium、Ultimate
- 提供形態: GitLab.com、GitLab Self-Managed、GitLab Dedicated
フォークは、選択したネームスペースに作成された、別のプロジェクトの個人的なコピーです。あなたのフォークには、アップストリームプロジェクトのリポジトリのコピーといくつかのプロジェクト設定が含まれますが、イシュー、マージリクエスト、Wikiページなどのプロジェクトコンテンツは含まれません。あなたのフォークからマージリクエストを作成し、アップストリームプロジェクトをターゲットにすることができます。個々のコミットは、あなたのフォークからアップストリームプロジェクトへチェリーピックすることもできます。
元のプロジェクトへの書き込みアクセス権がある場合、フォークは必要ありません。代わりに、ブランチを使用して作業を管理します。コントリビュートするプロジェクトへの書き込みアクセス権がない場合は、フォークするしてください。変更をあなたのフォークで行い、その後、マージリクエストを通じてアップストリームプロジェクトに提出してください。
機密マージリクエストを作成するには、パブリックプロジェクトの個人フォークを使用します。
アップストリームプロジェクトがアーカイブされると、フォークの関係は自動的に削除されます。フォーク関係の破損により完了したマージリクエストは、フォーク関係が後で復元されても再度開かれることはありません。
詳細については、プロジェクトのアーカイブを参照してください。
フォークを作成する
GitLabで既存のプロジェクトをフォークするには:
- プロジェクトのホームページの右上隅で、フォーク( )を選択します。
- オプション。プロジェクト名を編集します。
- プロジェクトURLで、フォークの所属先のネームスペースを選択します。
- プロジェクトslugを追加します。この値は、フォークへのURLの一部になります。ネームスペース内で一意である必要があります。
- オプション。プロジェクトの説明を追加します。
- 含めるブランチオプションのいずれかを選択します。
- すべてのブランチ(デフォルト)。
- デフォルトブランチのみ。
--single-branchおよび--no-tagsGitオプションを使用します。
- フォークの表示レベルを選択します。表示レベルの詳細については、プロジェクトとグループの表示レベルを参照してください。
- プロジェクトをフォークを選択します。
GitLabはフォークを作成し、新しいフォークのページにリダイレクトし、フォークの作成を監査ログに記録します。
変更を頻繁にアップストリームにコントリビュートする場合は、フォークのデフォルトターゲットを設定することを検討してください。
フォークを更新する
フォークはアップストリームプロジェクトと同期が取れなくなり、更新が必要になる場合があります:
- 進んでいる: フォークには、アップストリームリポジトリに存在しない新しいコミットが含まれています。フォークを同期するには、マージリクエストを作成して、変更をアップストリームリポジトリにプッシュします。
- 遅れている: アップストリームリポジトリには、フォークに存在しない新しいコミットが含まれています。フォークを同期するには、新しいコミットをフォークにプルします。
- 進んでいて、遅れている: アップストリームリポジトリとフォークの両方に、もう一方に存在しない新しいコミットが含まれています。フォークを完全に同期するには、マージリクエストを作成して変更をプッシュし、アップストリームリポジトリの新しい変更をフォークにプルします。
フォークをアップストリームプロジェクトと同期するには、GitLab UIまたはコマンドラインから更新してください。PremiumおよびUltimate層のGitLabは、フォークをアップストリームプロジェクトのプルミラーとして設定することで更新を自動化することもできます。
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エラー: User is not allowed to import projects
サービスアカウントを使用してプロジェクトをフォークする際に、次のエラーが表示されることがあります:
{"message":["Namespace is not valid","User is not allowed to import projects"]}この問題は、サービスアカウントがボットユーザーであり、プロジェクトの制限が増加している場合でも、個人のネームスペースにプロジェクトをフォークできないために発生します。
サービスアカウントを使用してプロジェクトをフォークする際の回避策は、プロジェクトフォークAPIでnamespace_idまたはnamespace_pathを使用してターゲットグループのネームスペースを指定することです。サービスアカウントは、デベロッパー、メンテナー、またはオーナーのロールを持つターゲットグループのメンバーである必要があります。
