デフォルトブランチ
- プラン: Free、Premium、Ultimate
- 提供形態: GitLab.com、GitLab Self-Managed、GitLab Dedicated
新しいプロジェクトを作成すると、GitLabはリポジトリにデフォルトブランチを作成します。デフォルトブランチには、他のブランチにはない特別な設定オプションがあります:
- これは削除できません。
- 強制プッシュに対して最初から保護されています。
- マージリクエストがイシューのクローズパターンを使用してイシューをクローズすると、作業はこのブランチにマージされます。
新しいプロジェクトのデフォルトブランチの名前は、GitLab管理者によってインスタンスまたはグループに加えられた設定の変更によって異なります。GitLabは、最初に特定されたカスタマイズがないか確認し、次に広範なレベルで確認します。GitLabのデフォルトは、カスタマイズが設定されていない場合にのみ使用します:
- プロジェクト固有のカスタムデフォルトブランチ名。
- プロジェクトの直接のサブグループで指定されたカスタムグループのデフォルトブランチ名。
- プロジェクトのトップレベルグループで指定されたカスタムグループのデフォルトブランチ名。
- インスタンスに設定されたカスタムデフォルトブランチ名。
- どのレベルでもカスタムデフォルトブランチ名が設定されていない場合、GitLabはデフォルトで
mainを使用します。
GitLab UIでは、どのレベルでもデフォルトを変更できます。GitLabは、リポジトリのコピーを更新するために必要なGitコマンドも提供しています。
プロジェクトのデフォルトブランチ名を変更する
前提要件:
- プロジェクトのオーナーまたはメンテナーのロールが必要です。
個々のプロジェクトのデフォルトブランチを更新するには:
- 左側のサイドバーで、検索または移動先を選択して、プロジェクトを見つけます。
- 設定 > リポジトリを選択します。
- ブランチのデフォルトを展開します。デフォルトブランチで、新しいデフォルトブランチを選択します。
- オプション。マージリクエストがクローズパターンを使用するときにイシューをクローズするには、デフォルトのブランチで参照されているイシューを自動的に終了しますチェックボックスを選択します。
- 変更を保存を選択します。
APIユーザーは、プロジェクトの作成または編集時に、Projects APIのdefault_branch属性を使用することもできます。
インスタンス内の新しいプロジェクトのデフォルトブランチ名を変更する
- プラン: Free、Premium、Ultimate
- 提供形態: GitLab Self-Managed、GitLab Dedicated
GitLab Self-Managedの管理者は、そのインスタンスでホストされているプロジェクトの初期ブランチをカスタマイズできます。個々のグループとサブグループは、プロジェクトのインスタンスのデフォルトをオーバーライドできます。
- 左側のサイドバーの下部で、管理者を選択します。
- 設定 > リポジトリを選択します。
- デフォルトブランチを展開します。
- 初期のデフォルトブランチ名で、新しいデフォルトブランチを選択します。
- 変更を保存を選択します。
設定を変更した後にこのインスタンスで作成されたプロジェクトは、グループまたはサブグループの設定でオーバーライドされない限り、カスタムブランチ名を使用します。
グループ内の新しいプロジェクトのデフォルトブランチ名を変更する
前提要件:
- グループとサブグループのオーナーロールが必要です。
グループ内の新しいプロジェクトのデフォルトブランチ名を変更するには:
- 左側のサイドバーで、検索または移動先を選択して、グループを見つけます。
- 設定 > リポジトリを選択します。
- デフォルトブランチを展開します。
- 初期のデフォルトブランチ名で、新しいデフォルトブランチを選択します。
- 変更を保存を選択します。
設定を変更した後にこのグループで作成されたプロジェクトは、サブグループの設定でオーバーライドされない限り、カスタムブランチ名を使用します。
初期デフォルトブランチを保護する
- プラン: Free、Premium、Ultimate
- 提供形態: GitLab.com、GitLab Self-Managed、GitLab Dedicated
GitLab管理者とグループオーナーは、次のいずれかのオプションを使用して、インスタンスまたは個々のグループのリポジトリのデフォルトブランチに適用するブランチ保護を定義できます:
- 完全に保護 - デフォルト値。デベロッパーは新しいコミットをプッシュできませんが、メンテナーはプッシュできます。だれも強制プッシュできません。
- 最初のプッシュ後に完全に保護 - デベロッパーはリポジトリに最初のコミットをプッシュできますが、その後は誰でもプッシュできません。メンテナーは常にプッシュできます。だれも強制プッシュできません。
- プッシュから保護 - デベロッパーは新しいコミットをプッシュできませんが、ブランチへのマージリクエストは承認できます。メンテナーはブランチにプッシュできます。
- 部分的に保護 - デベロッパーとメンテナーの両方が新しいコミットをプッシュできますが、強制プッシュはできません。
- 保護されていない - デベロッパーとメンテナーの両方が新しいコミットをプッシュでき、強制プッシュできます。
完全に保護が選択されていない限り、悪意のあるデベロッパーが機密データを盗もうとする可能性があります。たとえば、悪意のある.gitlab-ci.ymlファイルが保護ブランチにコミットされ、後でそのブランチに対してパイプラインが実行されると、グループのCI/CD変数が流出する可能性があります。
インスタンス内のすべてのプロジェクト
- プラン: Free、Premium、Ultimate
- 提供形態: GitLab Self-Managed、GitLab Dedicated
この設定は、各リポジトリのデフォルトブランチにのみ適用されます。他のブランチを保護するには、次のいずれかを実行する必要があります:
- リポジトリでブランチ保護を設定します。
- グループのブランチ保護を設定します。
GitLab Self-Managedインスタンスの管理者は、そのインスタンスでホストされているプロジェクトの初期のデフォルトのブランチ保護をカスタマイズできます。個々のグループとサブグループは、プロジェクトのインスタンスのデフォルト設定をオーバーライドできます。
- 左側のサイドバーの下部で、管理者を選択します。
- 設定 > リポジトリを選択します。
- デフォルトブランチを展開します。
- 初期のデフォルトのブランチ保護を選択します。
- グループオーナーがインスタンスのデフォルトブランチ保護をオーバーライドできるようにするには、Allow owners to manage default branch protection per group(オーナーがグループごとにデフォルトのブランチ保護を管理できるようにする)を選択します。
- 変更を保存を選択します。
デフォルトのブランチ保護のオーバーライドを防止する
- プラン: Premium、Ultimate
- 提供形態: GitLab Self-Managed、GitLab Dedicated
グループオーナーは、グループ単位でインスタンス全体に設定されたデフォルトのブランチ保護をオーバーライドできます。GitLab PremiumまたはUltimateでは、GitLab管理者はグループオーナーのこの権限を無効にし、インスタンスに設定された保護ルールを適用できます:
- 左側のサイドバーの下部で、管理者を選択します。
- 設定 > リポジトリを選択します。
- デフォルトブランチセクションを展開します。
- Allow owners to manage default branch protection per group(オーナーがグループごとにデフォルトのブランチ保護を管理できるようにする)チェックボックスをオフにします。
- 変更を保存を選択します。
GitLab管理者は、グループのデフォルトブランチ保護を引き続き更新できます。
グループ内のすべてのプロジェクト
- プラン: Premium、Ultimate
- 提供形態: GitLab.com、GitLab Self-Managed、GitLab Dedicated
グループオーナーは、グループ単位でインスタンス全体に設定されたデフォルトのブランチ保護をオーバーライドできます。GitLab PremiumまたはUltimateでは、GitLab管理者が初期のデフォルトのブランチ保護を適用できます。これにより、グループオーナーがこの設定を変更できなくなります。
- 左側のサイドバーで、検索または移動先を選択して、グループを見つけます。
- 設定 > リポジトリを選択します。
- デフォルトブランチを展開します。
- 初期のデフォルトのブランチ保護を選択します。
- 変更を保存を選択します。
リポジトリのデフォルトブランチ名を更新する
デフォルトブランチ名を変更すると、テスト、CI/CD設定、サービス、ヘルパーユーティリティ、およびリポジトリが使用するインテグレーションが中断される可能性があります。このブランチ名を変更する前に、プロジェクトオーナーとメンテナーに相談してください。この変更のスコープには、関連するコードやスクリプト内での古いブランチ名の参照も含まれていることを、プロジェクトオーナーおよびメンテナーが理解していることを確認してください。
既存のリポジトリのデフォルトブランチ名を変更する場合は、新しいブランチを作成しないでください。デフォルトブランチの名前を変更することで、その履歴を保持できます。この例では、Gitリポジトリ(example)のデフォルトブランチの名前を変更します:
ローカルコマンドラインで、
exampleリポジトリに移動し、デフォルトブランチにいることを確認します:cd example git checkout master既存のデフォルトブランチの名前を新しい名前(
main)に変更します。引数-mは、すべてのコミット履歴を新しいブランチに転送します:git branch -m master main新しく作成した
mainブランチをアップストリームにプッシュし、同じ名前のリモートブランチを追跡するようにローカルブランチを設定します:git push -u origin main古いデフォルトブランチを削除する予定がある場合は、新しいデフォルトブランチである
mainを指すようにHEADを更新します:git symbolic-ref refs/remotes/origin/HEAD refs/remotes/origin/main少なくともメンテナーのロールでGitLabにサインインし、このプロジェクトのデフォルトブランチを変更する手順に従います。新しいデフォルトブランチとして
mainを選択します。保護ブランチのドキュメントの説明に従って、新しい
mainブランチを保護します。オプション。古いデフォルトブランチを削除する場合は:
そのブランチを指しているものがないことを確認します。
リモートでブランチを削除します:
git push origin --delete master新しいデフォルトブランチが期待どおりに動作することを確認したら、後でブランチを削除できます。
プロジェクトのコントリビューターにこの変更を通知します。コントリビューターもいくつかの手順を実行する必要があるためです:
- コントリビューターは、新しいデフォルトブランチをリポジトリのローカルコピーにプルする必要があります。
- 古いデフォルトブランチをターゲットとするオープンマージリクエストを持つコントリビューターは、代わりに
mainを使用するようにマージリクエストを手動で再指定する必要があります。
リポジトリで、コード内の古いブランチ名への参照を更新します。
ヘルパーユーティリティやインテグレーションなど、リポジトリの外部にある関連コードおよびスクリプト内の古いブランチ名への参照を更新します。
デフォルトブランチの名前変更のリダイレクト
プロジェクト内の特定のファイルまたはディレクトリのURLには、プロジェクトのデフォルトブランチ名が埋め込まれており、ドキュメントまたはブラウザのブックマークに表示されることがよくあります。リポジトリのデフォルトブランチ名を更新すると、これらのURLが変更されるため、更新する必要があります。
移行期間中の混乱を軽減するため、プロジェクトのデフォルトブランチが変更されるたびに、GitLabは古いデフォルトブランチの名前を記録します。そのブランチが削除された場合、そのブランチ上のファイルまたはディレクトリを表示しようとすると、「見つかりません」ページが表示されるのではなく、現在のデフォルトブランチにリダイレクトされます。
関連トピック
- Wikiのデフォルトブランチを設定する
- Gitメーリングリストでのデフォルトブランチの名前変更に関するディスカッション
- 2021年3月のブログ投稿: The new Git default branch name(新しいGitのデフォルトブランチ名)
トラブルシューティング
デフォルトブランチを変更できない: 現在のブランチにリセットされる
この問題はイシュー20474で追跡しています。この問題は、HEADという名前のブランチがリポジトリに存在する場合によく発生します。問題を修正するには、以下を実行します:
ローカルリポジトリで、新しい一時ブランチを作成してプッシュします:
git checkout -b tmp_default && git push -u origin tmp_defaultGitLabで、その一時ブランチにデフォルトブランチを変更します。
ローカルリポジトリから、
HEADブランチを削除します:git push -d origin HEADGitLabで、使用するデフォルトブランチを変更します。
GraphQLでデフォルトブランチをクエリする
GraphQLクエリを使用して、グループ内のすべてのプロジェクトのデフォルトブランチを取得できます。
結果の単一ページにすべてのプロジェクトを返すには、GROUPNAMEをグループへのフルパスに置き換えます。GitLabは結果の最初のページを返します。hasNextPageがtrueの場合、after: nullのnullをendCursorの値に置き換えることで、次のページをリクエストできます:
{
group(fullPath: "GROUPNAME") {
projects(after: null) {
pageInfo {
hasNextPage
endCursor
}
nodes {
name
repository {
rootRef
}
}
}
}
}新しいサブグループが上位レベルのサブグループからデフォルトブランチ名を継承しない
サブグループでデフォルトブランチを設定しても、その中にある別のサブグループにプロジェクトが含まれている場合、デフォルトブランチは継承されません。
この問題はイシュー327208で追跡しています。