131 votes

Git : Empêcher les commits dans la branche master

(Pour simplifier) j'ai un master et une dev dans mon Git-repo. Je veux m'assurer que le master est toujours en train de travailler, donc tout le travail que je fais doit être dans la section dev branche.

Cependant, lorsque je fusionne mes modifications avec une --no-ff la fusion, j'ai tendance à rester dans la master et continuer à travailler dans cette branche (parce que j'ai oublié de vérifier ma branche dev branche).

Je peux mettre en place une règle pour le master branche, ce qui signifie que je ne peux pas faire de commits, ni de merges en avance rapide, mais seulement --no-ff fusionne depuis une autre branche ?

Cela doit fonctionner pour les dépôts hébergés privés (donc pas GitHub et BitBucket).

6 votes

"fast-forward commits" n'est pas une chose. Les commits sont juste des commits, git commit en fait un nouveau, il n'y a pas d'avance rapide. Il semble que vous vouliez simplement interdire les commits ordinaires lorsque la branche courante est master Dans ce cas, il convient d'examiner le pre-commit crochet.

213voto

qzb Points 3600

Oui, c'est possible. Vous devez créer un hook pre-commit qui rejette les commits vers la branche master. Git n'appelle pas le hook pre-commit lorsque vous appelez fusionner donc ce hook ne rejettera que les commits réguliers.

  1. Allez dans votre dépôt.

  2. Créer un fichier .git/hooks/pre-commit avec le contenu suivant :

    #!/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. Rendez-le exécutable (non requis sur Windows ) :

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

Pour désactiver avance rapide vous devez également ajouter l'option suivante à votre fichier .git/config fichier :

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

Si vous souhaitez également protéger la branche master sur votre site distant, consultez cette réponse : Comment restreindre l'accès à la branche master sur git ?

0 votes

Cela ressemble exactement à ce dont j'ai besoin. Est-ce que cela fonctionne également sous Windows ?

3 votes

@RasmusBækgaard oui : le bash script pour le hook sera interprété par le bash Git inclus dans Git pour Windows. (Vous n'avez simplement pas besoin de l'étape chmod).

0 votes

Note : vous pouvez également vous empêcher de pousser vers une télécommande master dans le crochet de pré-poussée. ex : gist.github.com/aaronhoffman/ffbfd36928f9336be2436cffe39feaec

36voto

JGC Points 1620

Vous pouvez utiliser le pré-commissionnement pour ce faire. Il possède une fonction intégrée no-commit-to-branch qui peut être utilisé pour empêcher les commits vers une ou plusieurs branches.

Configuration

Le processus de configuration de base est le suivant :

  • Installer en utilisant pip o Homebrew (instructions à https://pre-commit.com/#install )
  • Créer un .pre-commit-config.yaml dans la Racine de votre projet (voir ci-dessous pour un premier jet)
  • Installez les hooks dans votre configuration Git en exécutant pre-commit install .

Configuration de base pour la protection des branches

Voici une configuration de base qui comprend uniquement le no-commit-to-branch crochet :

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

Si vous voulez protéger plusieurs branches, vous pouvez utiliser include multiple --branch dans la liste des arguments :

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']

Tout cela n'est-il pas exagéré ?

Pre-commit a de nombreux autres des crochets intégrés, et une large collection de crochets construits par la communauté qui va transformer la façon dont vous nettoyez et validez vos commits. La raison pour laquelle je mentionne ceci est que, bien que cet outil puisse être excessif pour simplement empêcher les commits vers une branche protégée, il possède de nombreuses autres fonctionnalités qui en font un ajout simple et convaincant à tout projet Git.

3 votes

Super utile ! Je vais certainement essayer ceci, merci pour l'information @JGC

0 votes

Merci, c'est une bonne suggestion ! Notez que main et master sont couverts par défaut s'il n'y a pas de --branch .

13voto

Michel Samia Points 775

Il peut être judicieux de l'installer globalement via

git config --global core.hooksPath ~/githooks

et en déplaçant ce pre-commit dans ce répertoire

1 votes

Et si j'ai plusieurs dépôts - cela ne va-t-il pas les affecter tous ?

2 votes

Et c'est ce que vous devez faire dans la plupart des cas.

0 votes

Disons que j'ai ce projet bizarre, où ils ont renommé master a Production - peut-on faire des exceptions ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X