web-dev-qa-db-fra.com

Pourquoi ne puis-je pas supprimer une branche d'un référentiel GitLab distant?

J'essaie de supprimer une branche localement et dans un référentiel GitLab distant. Son nom est Origin/feat. J'ai essayé git Push --delete Origin feat. Git se plaint:

remote: error: By default, deleting the current branch is denied, because the next
remote: 'git clone' won't result in any file checked out, causing confusion.
remote: 
remote: You can set 'receive.denyDeleteCurrent' configuration variable to
remote: 'warn' or 'ignore' in the remote repository to allow deleting the
remote: current branch, with or without a warning message.
remote: 
remote: To squelch this message, you can set it to 'refuse'.
remote: error: refusing to delete the current branch: refs/heads/feat

OK a du sens, alors j’ai essayé de passer à Origin/master avec git checkout master et il m’indique: Already on 'master'. La branche actuelle doit-elle également être définie dans le répertoire distant? Comment je ferais ça? 

7
speedymcs

Edit (selon les commentaires de l'OP - je n'ai pas utilisé GitLab): GitLab dispose d'une interface Web avec des menus déroulants. Vous avez besoin de celui sous la vue Paramètres (pas la vue Projet). Choisissez une branche dans la vue Paramètres sous "Branche par défaut" et cliquez sur "Enregistrer les modifications" pour définir la branche actuelle sur le serveur.

Détails

Vous avez la bonne idée, mais vous devez vous rappeler qu'il y a deux référentiels - deux Gits - impliqués.

Chaque fois que vous obtenez le texte préfixé par remote:, cela signifie que le texte provient de autre Git . Ainsi, lorsque vous avez votre Git, demandez à l'autre Git de supprimer feat, c'est l'autre Git qui se plaint que feat est la branche actuelle.

Par conséquent:

La branche actuelle doit-elle également être définie dans le répertoire distant?

Oui (enfin, "au lieu de" plutôt que "aussi").

Comment je ferais ça?

En général, vous procédez de la même manière avec n'importe quel référentiel: connectez-vous, cd au répertoire du référentiel, puis exécutez git checkout. Mais il y a un problème avec les référentiels Push -able sur les serveurs:

  • C'est sur le serveur. Êtes-vous même autorisé à vous connecter? Si ce n'est pas le cas, vous avez besoin d'une alternative (spécifique au serveur).
  • C'est probablement un référentiel --bare, de sorte que vous ne pouvez pas utiliser git checkout directement. Le truc ici est d’utiliser git symbolic-ref pour mettre à jour HEAD:

    git symbolic-ref HEAD refs/heads/master
    

    Bien entendu, cela suppose que vous puissiez vous connecter (voir le premier point). Si, par exemple, une interface Web vous permet de modifier la branche actuelle de la télécommande, il va falloir que cette opération git symbolic-ref s'opère à votre place.

3
torek

Essayer 

git Push Origin - suppression de l'exploit

15
Charles

Pour supprimer une branche locale de votre machine:

git branch -d <branch-name>

Pour supprimer une branche distante:

git Push Origin :<branch-name>

Dans votre cas, les déclarations ci-dessus seraient:

Pour supprimer une branche locale de votre machine:

git branch -d feat

Pour supprimer une branche distante:

git Push Origin :feat
10
Krishna Kuntala

J'ai eu le même problème lorsque je voulais supprimer le maître de Origin.

En supposant que vous vouliez supprimer le maître , j’ai résolu le problème en 3 étapes:

  1. Allez sur la page GitLab de votre référentiel, puis cliquez sur le bouton “ Paramètres ”.

  2. Dans Branche par défaut , changez la branche par défaut de votre maître en Autre.

  3. Dans branches protégées , s'il existe une protection, déprotégez le maître.

Ensuite, vous essayez à nouveau de supprimer la branche.

Si ce n'est pas le maître que vous voulez supprimer, suivez les mêmes étapes avec la branche souhaitée.

0
Gabriel Vianna

si vous essayez de supprimer plusieurs branches, toute branche protégée (par exemple, la branche par défaut, généralement master), entraînera l'échec de la demande. Vous pouvez donc essayer de les supprimer une à la fois ou d'exclure les branches protégées connues.

Par exemple, j'essayais de supprimer des branches fusionnées avec

$ git fetch  mygitlabremote --Prune; \
    git branch --remotes --list mygitlabremote/* --merged \
    | cut -d/ -f2 | grep -v master \
    | xargs git Push mygitlabremote  --delete
$ git fetch  mygitlabremote --Prune
0
ThorSummoner