Git dispose-t-il d'un «mode sans échec» pour empêcher la réécriture de l'historique?

11

Lorsque vous êtes un peu nouveau avec Git (et DVCS en général), et que vous commencez à explorer les modifications de réécriture de l'historique, vous êtes en sécurité si le référentiel n'est que local, mais vous pouvez rencontrer des problèmes si vous travaillez avec des télécommandes et essayez de pousser de tels changements.

Une fonctionnalité que j'attendrais est la possibilité d'activer un "mode sans échec" qui m'empêcherait essentiellement de faire tout ce que je ne devrais pas faire ... Et qu'est-ce que je veux dire par là? Je veux dire des changements de réécriture de l'histoire pour des choses déjà poussées à une origine. Je ne peux pas le définir précisément, mais cela inclurait des cas tels que:

  • commit --amend quand HEAD a déjà été poussé
  • rebase d'une succursale non locale
  • reset d'une branche qui a été poussée

Ce sont des exemples de situations qui feront probablement pushéchouer le prochain (car ce ne serait pas une avance rapide, IIRC). J'ai fait une partie de cela par accident et j'ai dû recréer la branche sur la télécommande. Et j'ai quand même eu la chance de le faire assez rapidement pour que personne ne tire l'histoire que j'ai réécrite.

Je pense qu'il est possible d'identifier ce type de modifications et, à la demande, d'empêcher l'utilisateur de les effectuer. Y a-t-il peut-être une option pour cela?

S'il n'y en a pas, pensez-vous qu'il vaut la peine d'essayer de le créer? Souhaitez-vous essayer de définir précisément comment identifier un tel «changement dangereux»?

Kos
la source
Dans un environnement de travail dans lequel la validation de modifications incorrectes affecte d'autres programmeurs, vous devriez probablement être plus réticent à effectuer ces actions, sauf si vous êtes sûr que c'est quelque chose qui devrait fonctionner. Même dans ce cas, vous devez vérifier qu'aucun problème ne persiste par la suite. Imaginez qu'il y a quelques années, je faisais partie d'une équipe de nombreux programmeurs dans laquelle on n'aurait aucun scrupule à commettre des sources qui ne compileraient pas ! Je voulais le tuer par balle après 3 mois.
Neil
Il semble raisonnable que vous puissiez détecter cela dans un crochet sur la machine distante, puis rejeter les modifications.
Andrew T Finnell
Je ne comprends pas votre question. Le mode par défaut est sûr. Il ne vous permettra pas de pousser, sauf si vous le spécifiez --force.
Šimon Tóth
J'aimerais aussi voir quelque chose comme ça. En gros, j'aimerais fournir à ceux qui apprennent git une version plus sûre, probablement en enveloppant simplement la ligne de commande et en exposant uniquement les bases: commit, pull, push, simple stuff. Forcez-les à utiliser git complet pour quoi que ce soit sur cette page: git-scm.com/book/en/Git-Tools-Rewriting-History Git est déjà un peu plus difficile à apprendre que d'autres outils pour avoir un référentiel local et distant auquel penser - vous inquiéter de pouvoir rebaser au lieu de revenir en arrière est effrayant.
Chris Moschini

Réponses:

5

Cela semble très proche, sinon la même question que la stratégie de prévention ou d'interception de la réécriture de l'historique Git

Pour résumer, vous pouvez activer

git config --system receive.denyNonFastforwards true

et

git config --system receive.denyDeletes true

Ou écrivez un crochet de réception de message pour rejeter tout ce que vous jugez être une réécriture.

Andrew T Finnell
la source
1
Je crois que denyNonFastforwardsc'est la valeur par défaut (?), Alors que ce denyDeletesn'est pas le cas. Ces deux sont utiles, mais j'imagine une solution côté client qui m'empêcherait de faire un commit --amendsi je ne pouvais pas le pousser (parce que HEAD était déjà poussé).
Kos
En d'autres termes: en plus des mécanismes qui permettent de garder une télécommande cohérente, j'aimerais quelque chose qui permette de garder un clone "cohérent" avec une télécommande également.
Kos
@Kos Vous pouvez également créer des hooks locaux
Andrew T Finnell
Y at - il un moyen de mettre denyNonFastfowardsà trueseulement sur la branche master? J'aimerais que mes branches de sujet soient autorisées à être rebasées et forcées.
nnyby
2

Non, car cela fait partie de la philosophie de git de vous donner la pleine puissance et de vous permettre de gérer cette puissance comme vous le souhaitez.

Si vous n'adhérez pas à cette philosophie, alors peut-être que passer à Mercurial en vaudrait la peine car ils permettent de réécrire l'histoire, mais de manière limitée ou, pour être clair et réticent, cela vous donne l'impression que ce n'est pas une bonne idée.

Klaim
la source
2
Je fais des erreurs. Un mécanisme qui m'oblige à confirmer explicitement chaque fois que je fais quelque chose de dangereux est quelque chose qui semble correspondre à «gérer mon pouvoir comme je le souhaite». :-) (Aussi Git le fait déjà à l'occasion.)
Kos
2

AFAIK, la façon dont git résout ces problèmes est que chaque fois que vous demandez une telle action, il l'exécute localement, mais vous informe que ce que vous faites peut avoir des conséquences indésirables. À ce stade, vous n'avez encore rien poussé, vous êtes donc en mesure de revoir votre référentiel local et peut-être d'annuler la modification dangereuse avant de pousser. Vous devez cependant faire attention à ce que git vous dit, et vous feriez mieux de faire attention lorsque vous réparez de telles erreurs.

tdammers
la source