2017-01-27 1 views
1

J'ai quelques fichiers (c'est-à-dire quelques fichiers de version) dans un dépôt distant qui ne devraient pas être changés par de futurs commits. Y at-il un moyen de s'assurer que les futurs utilisateurs qui s'engagent dans ce fichier ne seront pas en mesure de remplacer le fichier dans la télécommande, mais toujours être en mesure de pousser. Existe-t-il un moyen plus simple de faire cela que d'utiliser des githooks? Je ne veux pas créer un commit qui annule les changements d'utilisateurs dans un githook. Y a-t-il une façon plus propre de faire cela?Existe-t-il un moyen d'empêcher la validation d'un fichier dans un référentiel distant?

+0

Comment la chose peut-elle être faite plus facilement qu'elle ne l'est? La technique Hooks existe spécialement dans ce but. Ecrire un crochet qui vérifie les fichiers et renvoie une erreur si quelque chose ne va pas. – oklas

Répondre

0

Vous n'avez pas besoin de créer un commit supplémentaire annulant les modifications de l'utilisateur si vous utilisez un hook pre-receive. Ce crochet vous permet d'inspecter les changements qui sont poussés à votre repo, et de les rejeter (tout ou rien) s'ils apportent des modifications au (x) fichier (s) interdit (s). Ou si vous préférez ignorer les modifications apportées à ce fichier et autoriser les autres modifications, utilisez un crochet update pour ne rejeter que les modifications apportées aux fichiers interdits, tout en autorisant les autres utilisateurs. (Mais cela casse l'intégrité transactionnelle de leur push, donc vous faites l'hypothèse que les autres changements ne dépendront pas des changements qu'ils essayaient de faire aux fichiers interdits.)

+0

Existe-t-il un moyen d'exécuter le hook de mise à jour sur une fusion (c'est-à-dire lorsqu'une requête pull se produit)? –

+0

Non. 'Update' est pour quand un push est reçu. Si ces fichiers sont modifiés pendant un pull, c'est plus compliqué, car 'pre-commit' ne sera pas appelé alors. Il y a 'post-merge', mais cela s'appelle après la fin d'une fusion, donc tout ce que vous pourriez faire serait de rétablir les changements dans les fichiers interdits. –

+0

Je pense que vous confondez les crochets côté serveur et les crochets client. –

3

Je pense que ce dont vous avez besoin en fonction de votre besoin est (je peut-être mal ici) est à: -

pour ignorer temporairement les changements dans un certain fichier: exécuter

git update-index --assume-unchanged <file> 

Puis, quand vous voulez suivre les changements encore:

git update-index --no-assume-unchanged <file> 

http://gitready.com/intermediate/2009/02/18/temporarily-ignoring-files.html

Cela conservera le fichier dans votre git. Toute modification locale effectuée dans ce fichier ne pourra pas être ajoutée, validée et transmise au dépôt distant.