Lorsque j'exécute git remote -v
dans l'un de mes référentiels Git qui a une ou plusieurs télécommandes configurées, je vois que chaque télécommande a à la fois des spécifications d'extraction et de transmission:
$ git remote -v
<remote-name> ssh://host/path/to/repo (fetch)
<remote-name> ssh://host/path/to/repo (push)
Pour les télécommandes qui pointent vers des développeurs pairs, il n'est pas nécessaire de pousser, et Git refusera de toute façon de pousser vers un référentiel non nu. Existe-t-il un moyen de configurer ces télécommandes en tant que "récupération uniquement" sans adresse ou capacités push?
Réponses:
Je ne pense pas que vous puissiez supprimer l'URL push, vous ne pouvez la remplacer que pour qu'elle soit autre que l'URL d'extraction. Donc, je pense que le plus proche que vous obtiendrez est quelque chose comme ceci:
Vous définissez l'URL push sur
no-pushing
, qui, tant que vous n'avez pas de dossier du même nom dans votre répertoire de travail, git ne pourra pas localiser. Vous forcez essentiellement git à utiliser un emplacement qui n'existe pas.la source
git remote set-url --push origin -- --read-only--
- notez le supplément--
pour permettre un nom avec des tirets au début. Cela me semblait plus lisible.En plus de changer l'URL push en quelque chose d'invalide (par exemple
git remote set-url --push origin DISABLED
), on peut également utiliser lepre-push
hook.Un moyen rapide d'arrêter
git push
est de créer un lien symbolique/usr/bin/false
pour être le crochet:L'utilisation d'un crochet permet un contrôle plus fin des poussées si cela est souhaitable. Voir
.git/hooks/pre-push.sample
pour un exemple de la façon d'empêcher l'envoi de commits de travail en cours.Pour éviter de pousser vers une branche spécifique ou pour limiter la poussée vers une seule branche, ceci dans un exemple de hook:
Un dépôt de test avec plusieurs télécommandes:
Pousser vers
origin
est autorisé:Pousser vers une autre télécommande n'est pas autorisé:
Notez que le
pre-push
script de hook peut être modifié pour, entre autres, afficher un message à stderr indiquant que le push a été désactivé.la source
La déclaration générale "Git refusera de pousser vers un dépôt non nu" n'est pas vraie. Git refusera de pousser vers un référentiel distant non nu uniquement si vous essayez de transmettre des modifications qui se trouvent sur la même branche que le répertoire de travail extrait du référentiel distant.
Cette réponse donne une explication simple: https://stackoverflow.com/a/2933656/1866402
(J'ajoute ceci comme réponse car je n'ai pas encore assez de réputation pour ajouter des commentaires)
la source
Si vous avez déjà une télécommande et que vous voulez simplement vous empêcher de faire quelque chose comme pousser accidentellement directement vers
master
ourelease/production
, vous pouvez empêcher cette utilisationgit config
.Pour mémoire, ce
no_push
n'est pas un nom spécial. C'est juste le nom d'une branche inexistante. Vous pouvez donc l'utiliser$ git config branch.master.pushRemote create_a_pr_and_do_not_push_directly_to_master
et cela fonctionnerait très bien.Plus d'informations: git-config pushRemote
la source
Si vous avez le contrôle sur le référentiel, vous pouvez y parvenir en utilisant les autorisations. L'utilisateur qui récupère le référentiel ne doit pas disposer d'autorisations d'écriture sur le référentiel maître.
la source