マスターブランチでのコミットを防止する


84

(簡単にするために)Gitリポジトリにmasterブランチとadevがあります。masterブランチが常に機能していることを確認したいので、実行するすべての作業はdevブランチ内で行う必要があります。

ただし、変更をマージでマージ--no-ffすると、masterブランチにとどまり、ブランチで作業を続ける傾向があります(devブランチをチェックアウトするのを忘れたため)。

masterコミットと早送りマージを実行できないが、--no-ff別のブランチからのマージのみを実行できるというルールをブランチに設定できますか?

これは、プライベートでホストされているリポジトリで機能する必要があります(GitHubやBitBucketではなくergo)。


4
「早送りコミット」は問題ではありません。コミットは単なるコミットでありgit commit、新しいコミットを作成します。早送りは発生しません。現在のブランチがmasterであるときに通常のコミットを禁止したいようですpre-commit。その場合は、フックを調べてください。
torek 2016年

回答:


154

はい、可能です。マスターブランチへのコミットを拒否するpre-commitフックを作成する必要があります。マージコマンドを呼び出すときにGitはpre-commitフックを呼び出さないため、このフックは通常のコミットのみを拒否します。

  1. リポジトリに移動します。
  2. 次の内容でファイル.git / hooks / pre-commitを作成します。

    #!/bin/sh
    
    branch="$(git rev-parse --abbrev-ref HEAD)"
    
    if [ "$branch" = "master" ]; then
      echo "You can't commit directly to master branch"
      exit 1
    fi
    
  3. 実行可能にする(Windowsでは必要ありません):

    $ chmod +x .git/hooks/pre-commit
    

早送りマージを無効にするには、.git / configファイルに次のオプションも追加する必要があります。

[branch "master"]
    mergeoptions = --no-ff

リモートのマスターブランチも保護する場合は、次の回答を確認してください:gitでマスターブランチへのアクセスを制限する方法


これは私が必要としているものとまったく同じように見えます-これはWindowsでも機能しますか?
ラスマスBækgaard

2
@RasmusBækgaardはい、そうなります。フックのbashスクリプトは、Git forWindowsに含まれているGitbashによって解釈されます。(chmodステップは必要ありません)
VonC 2016年

注:masterプリプッシュフックでリモートブランチにプッシュするのを防ぐこともできます。例:gist.github.com/aaronhoffman/ffbfd36928f9336be2436cffe39feaec
Aaron Hoffman

4
プロジェクトリポジトリにこれらのルールや他のgitフックを追加する方法を探している人は、次の単純なnpmパッケージを確認してください:github.com/kilianc/shared-git-hooks、の下にあるものを含めることはできないため.gitディレクトリをリポジトリに追加します。
George Dimitriadis 2017年

9
また、これはローカルのgitリポジトリ専用ですが、.gitディレクトリの内容を手動で変更せずに、すべての開発者に対して異なるgitリポジトリにルールを適用するにはどうすればよいですか?
アレクサンダーミルズ

13

pre-commitユーティリティを使用してこれを行うことができます。no-commit-to-branch1つ以上のブランチへのコミットを防ぐために使用できるフックが組み込まれています。

セットアップ

基本的なセットアッププロセスは次のとおりです。

  • pipまたはbrewを使用してインストールします(https://pre-commit.com/#installの手順)
  • .pre-commit-config.yamlプロジェクトのルートにファイルを作成します(最初のドラフトについては以下を参照してください)
  • を実行して、フックをgitconfigにインストールしますpre-commit install

ブランチを保護するための基本構成

no-commit-to-branchフックだけを含む基本的な構成は次のとおりです。

repos:
- repo: https://github.com/pre-commit/pre-commit-hooks
  rev: v3.3.0
  hooks:
    - id: no-commit-to-branch
      args: ['--branch', 'master']

複数のブランチを保護したい場合--branchは、引数リストに複数の引数を含めることができます。

repos:
- repo: https://github.com/pre-commit/pre-commit-hooks
  rev: v3.3.0
  hooks:
    - id: no-commit-to-branch
      args: ['--branch', 'master', '--branch', 'staging']

これはすべてやり過ぎではありませんか?

Pre-commitには、他にも多くの組み込みフックと、コミットのクリーンアップと検証の方法を変革するコミュニティ構築フックの大規模なコレクションがあります。私がこれに言及する理由は、このツールは保護されたブランチへのコミットを防ぐにはやり過ぎかもしれませんが、他の多くの機能を備えているため、gitプロジェクトに魅力的で簡単に追加できます。


7

を介してグローバルにインストールすることは理にかなっているかもしれません

git config --global core.hooksPath ~/githooks

そのpre-commitファイルをそのディレクトリに移動します


複数のリポジトリがある場合はどうなりますか?すべてのリポジトリに影響しませんか?
ラスマスBækgaard

1
そしてそれはあなたがほとんどの場合何をすべきかです
ミシェルサミア

名前が変更さmasterれたこの奇妙なプロジェクトProductionがあるとしましょう-例外を作成できますか?
ラスマスBækgaard

またはbashの演算子を使用して、クライアント側で保護するブランチをさらに指定できます
MichelSamia19年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.