プロジェクトの分岐ワークフロー
可能な限り、共通の Git リポジトリで作業し、ブランチ戦略を使って作業を管理することを推奨します。しかし、貢献したいリポジトリへの書き込み権限がない場合は、フォークを作成することができます。
フォークとは、リポジトリとそのブランチの個人的なコピーのことで、好きな名前空間に作成します。自分のフォークに変更を加え、アクセス権のないリポジトリにマージリクエストで提出します。
フォークの作成
- GitLab 13.11 で、
fork_project_form
というフラグを持つ新しいフォームが導入されました。デフォルトでは無効になっています。- GitLab14.8でGitLab.comで有効になり、自己管理されるようになりました。機能フラグ
fork_project_form
を削除。
GitLab で既存のプロジェクトをフォークするには:
- プロジェクトのホームページで、右上にあるFork({fork}) を選択します:
- オプション。プロジェクト名を編集します。
- プロジェクトURLでは、フォークが属するネームスペースを選択します。
- プロジェクトスラッグを追加します。この値はフォークのURLの一部になります。名前空間内で一意でなければなりません。
- オプションです。プロジェクトの説明を追加します。
- フォークの可視性レベルを選択します。可視性レベルの詳細については、プロジェクトとグループの可視性をお読みください。
- フォークプロジェクトを選択します。
GitLab がフォークを作成し、新しいフォークのページにリダイレクトします。
フォークを更新
フォークがアップストリームリポジトリと同期しなくなり、更新が必要になることがあります:
- その前にフォークにアップストリームリポジトリにはない新しいコミットが含まれています。フォークを同期させるには、マージリクエストを作成して変更をアップストリームリポジトリにプッシュしてください。
- 後方:アップストリームリポジトリには、あなたのフォークには存在しない新しいコミットが含まれています。フォークを同期するには、新しいコミットをフォークにプルします。
- 前にも後ろにもアップストリームリポジトリとあなたのフォークの両方に、他方には存在しない新しいコミットが含まれています。フォークを完全に同期させるには、マージリクエストを作成して自分の変更をプッシュし、アップストリームリポジトリの新しい変更を自分のフォークにプルします。
フォークをアップストリームリポジトリと同期するには、GitLab UIまたはコマンドラインから更新します。GitLab PremiumとUltimate階層では、フォークをアップストリームリポジトリのプルミラーとして設定することで、更新を自動化することもできます。
UI から
GitLab UIからフォークを更新するには:
- 左のサイドバーで、Search を選択するか、次のページに進んでください。
- View all my projects を選択します。
- 更新したいフォークを選択します。
-
ブランチ名のドロップダウンリストの下にあるForked from({fork}) 情報ボックスで、フォークが先行か後行か、あるいはその両方かを判断します。この例では、フォークはアップストリームリポジトリの後ろにあります:
- あなたのフォークがアップストリームリポジトリより前にある場合は、マージリクエストを作成を選択して、あなたのフォークの変更をアップストリームリポジトリに追加するよう提案してください。
- あなたのフォークがアップストリームリポジトリより遅れている場合、Update forkを選択してアップストリームリポジトリから変更を取り込みます。
- フォークがアップストリームリポジトリより先にあり、かつ遅れている場合、マージ競合が検出されない場合にのみ利用可能なUIから更新できます:
- フォークにマージコンフリクトがない場合、アップストリームリポジトリに変更をプッシュする場合はマージリクエストを作成、フォークに変更をプルダウンする場合はフォークを更新、またはその両方を選択できます。フォークの変更の種類によって、適切なアクションが決まります。
- フォークにマージ競合がある場合は、コマンドラインからフォークを更新してください。
コマンドラインから
コマンドラインからフォークを更新するには、まずupstream
リモートリポジトリをフォーク用に設定してください:
- まだクローンを作成していない場合は、ローカルにクローンを作成してください。詳細については、リポジトリのクローンを参照してください。
-
フォークに設定されているリモートを表示します:
git remote -v
-
フォークが元のリポジトリを指すリモートを持たない場合、以下の例のいずれかを使用して
upstream
というリモートを設定してください:# Use this line to set any repository as your upstream after editing <upstream_url> git remote add upstream <upstream_url> # Use this line to set the main GitLab repository as your upstream git remote add upstream https://gitlab.com/gitlab-org/gitlab.git
ローカルコピーに追加のリモートが設定されていることを確認したら、フォークを更新する準備ができました。
-
ローカルコピーでデフォルトブランチをチェックアウトしたことを確認し、
main
をデフォルトブランチの名前に置き換えます:git checkout main
Git がステージされていない変更を見つけたら、コミットするか隠しておいてください。
-
アップストリームリポジトリに変更をフェッチします:
git fetch upstream
-
main
を更新するブランチの名前に置き換えてください:git pull upstream main
-
サーバー(GitLab.com または自己管理)上のあなたのフォークリポジトリに変更をプッシュします:
git push origin main
リポジトリミラーリングの場合
以下の条件をすべて満たせば、フォークをアップストリームのミラーとして設定できます:
- サブスクリプションがPremiumまたはUltimateであること。
- すべての変更をブランチで作成します (
main
ではありません)。 -
main
を変更する必要がある、機密イシューのマージリクエストには携わりません。
リポジトリミラーリングは、あなたのフォークと元のリポジトリとの同期を維持します。この方法では、1時間に1回フォークを更新し、手動でgit pull
を更新する必要はありません。設定方法については、プルミラーリングの設定をお読みください。
アップストリームへのマージ
アップストリームプロジェクトにコードを送る準備ができたら、マージリクエストを作成してください。ソースブランチには、フォークしたプロジェクトのブランチを選択します。ターゲットブランチには、元のプロジェクトのブランチを選択します。
そして、ラベルやマイルストーンを追加し、あなたの変更をレビューできる人にマージリクエストを割り当てることができます。そして、マージリクエストを送信を選択し、処理を終了します。マージに成功すると、あなたの変更がマージ先のリポジトリとブランチに追加されます。
フォークのリンク解除
フォーク関係を削除すると、あなたのフォークとアップストリームプロジェクトとのリンクが解除されます。フォークは独立したプロジェクトになります。
前提条件:
- フォークのリンクを解除するには、プロジェクトオーナーである必要があります。
フォーク関係を削除するには
- 左のサイドバーで「検索」または「移動」を選択してあなたのプロジェクトを検索します。
- 設定] > [全般]を選択します。
- 詳細設定] を展開します。
- フォーク関係の削除] セクションで、[フォーク関係の削除] を選択します。
- 確認するには、プロジェクト・パスを入力し、Confirm を選択します。
別のリポジトリとオブジェクトを共有するためにハッシュ化されたストレージプールを使用しているフォークのリンクを解除するとき:
- すべてのオブジェクトがプールからフォークにコピーされます。
- コピー処理が完了すると、ストレージプールからの更新はフォークに伝搬されません。
関連するトピック
- GitLab コミュニティフォーラム:フォークのリフレッシュ
トラブルシューティング
エラー:An error occurred while forking the project. Please try again
このエラーは、フォークされたプロジェクトと新しいネームスペース間の共有Runner設定の不一致が原因である可能性があります。詳細は Runner ドキュメントのForksを参照してください。
フォーク関係の削除に失敗しました
UIやAPIからフォークを削除してもうまくいかない場合は、Railsのコンソールセッションでフォークリレーションシップの削除を試みることができます:
p = Project.find_by_full_path('<project_path>')
u = User.find_by_username('<username>')
Projects::UnlinkForkService.new(p, u).execute