Pourquoi ne puis-je pas accéder à ce référentiel nu?

283

Pouvez-vous expliquer ce qui ne va pas avec ce flux de travail?

$ git init --bare bare
Initialized empty Git repository in /work/fun/git_experiments/bare/
$ git clone bare alice
Cloning into alice...
done.
warning: You appear to have cloned an empty repository.
$ cd alice/
$ touch a
$ git add a
$ git commit -m "Added a"
[master (root-commit) 70d52d4] Added a
 0 files changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 a
$ git push
No refs in common and none specified; doing nothing.
Perhaps you should specify a branch such as 'master'.
fatal: The remote end hung up unexpectedly
error: failed to push some refs to '/work/fun/git_experiments/bare'

Ne git pushpousse pas toujours vers le référentiel à partir duquel j'ai cloné?

ripper234
la source
Ne devriez-vous pas spécifier la branche à pousser?
Rekin
3
pas après un clone !!! une fois que le problème est résolu, cela fonctionne très bien et pas besoin de spécifier la branche ... ce n'est que lors de la première extraction d'un référentiel vide qui est TRÈS TRÈS ennuyeux ... ils devraient résoudre ce problème.
Dean Hiller
J'espère que ce message serait utile à quelqu'un lorsque vous essayez de le faire ci-dessus - samranga.blogspot.com/2015/07/… L'erreur dans la question peut être sautée même lorsque vous essayez de créer un référentiel BitBucket git à partir d'un projet déjà local
Samitha Chathuranga

Réponses:

483

Oui, le problème est qu'il n'y a pas de commits en "nu". C'est un problème avec le premier commit uniquement, si vous créez les dépôts dans l'ordre (bare, alice). Essayez de faire:

git push --set-upstream origin master

Cela ne serait nécessaire que la première fois. Ensuite, cela devrait fonctionner normalement.

Comme l'a souligné Chris Johnsen, vous n'auriez pas ce problème si votre push.default était personnalisé. J'aime en amont / tracking.

Seth Robertson
la source
1
Je fais sudo apt-get upgrade git-coreet sudo apt-get upgrade gitil pense qu'aucune mise à jour n'est nécessaire. git --versionrenvoie 1.7.3.1. Une idée de ce qui manque? J'avoue qu'actuellement apt-get updateça ne marche pas pour moi, mais ça ne fait pas si longtemps.
ripper234
1
@ ripper234: La version actuelle de git est 1.7.5.3 Vous pouvez soit vivre avec les désagréments, utiliser un flux de travail différent, soit installer manuellement le dernier git sans emballage Debian / Ubuntu.
Seth Robertson
Ah oui, j'oublie que les logiciels prennent du temps avant d'être emballés. Je suis un noob Linux, venant de Windows et utilisé pour cliquer ici pour installer la dernière version.
ripper234
9
Concernant "La version récente n'a pas ce problème": Même dans les versions récentes, la valeur par défaut pour les push ne semble pas avoir changé depuis matching; vous avez peut-être push.defaultréglé sur upstream/ tracking(ou current) dans votre ~/.gitconfig?
Chris Johnsen
4
Essayez git push origin master:masterde le rendre explicite. Si cela ne fonctionne pas, vérifiez pour voir sur quelle branche vous vous trouvez: git branchpeut - être que vous n'avez pas fait le premier commit ou que vous avez fait ce commit sur une branche autre que master.
Seth Robertson
43

Si vous:

 git push origin master

il poussera au repo nu.

Il semble que votre dépôt alice ne suit pas correctement.

cat .git/config

Cela montrera la télécommande et la branche par défaut.

Si vous

 git push -u origin master

Vous devriez commencer à suivre cette télécommande et cette branche. Je ne sais pas si cette option a toujours été dans git.

serby
la source
30

La réponse à cette question connexe a fourni la solution pour moi ... c'était juste une erreur stupide:

N'oubliez pas de vous engager en premier!

https://stackoverflow.com/a/7572252

Si vous ne vous êtes pas encore engagé dans votre dépôt local, il n'y a rien à pousser, mais le message d'erreur Git que vous obtenez ne vous aide pas trop.

phpguru
la source
17
git push --all

est la manière canonique de tout pousser vers un nouveau dépôt nu.

Une autre façon de faire la même chose est de créer votre nouveau référentiel non nu, puis de faire un clone nu avec

git clone --bare

puis utilisez

git remote add origin <new-remote-repo>

dans le référentiel d'origine (non dénudé).

Ebneter
la source
... alors vous avez dévalorisé la réponse? Il est le moyen standard pour pousser tout à un nouveau dépôt nu. Si cela n'a pas fonctionné pour vous, il y a un autre problème.
Ebneter
Tu as raison, je n'aurais probablement pas dû, je sais que tu essayais juste d'aider. Si vous le modifiez, j'annule mon downvote.
ripper234
Merci, édité avec une autre façon d'accomplir la même tâche.
ebneter
Votre réponse m'a aidé merci;) Mais à la fin de la commande, le chemin doit être présent comme ceci: git push --all ../test_repol'URL du repo à la fin de la commande;)
Metafaniel
@Metafaniel Cela dépend de la façon dont vous l'avez configuré. Si votre dépôt local a déjà la télécommande correctement configurée, "git push --all" devrait fonctionner tel quel.
ebneter
7

Essayez ceci dans votre aliceréférentiel (avant de pousser):

git config push.default tracking

Ou, configurez-le comme valeur par défaut pour votre utilisateur avec git config --global ….


git pushutilise par défaut le originréférentiel (qui est normalement le référentiel à partir duquel vous avez cloné le référentiel actuel), mais il ne choisit pas par défaut de pousser la branche en cours - il choisit par défaut de ne pousser que les branches qui existent à la fois dans le référentiel source et dans le référentiel de destination.

La push.defaultvariable de configuration (voir git-config (1) ) contrôle ce qui git pushva pousser quand on ne lui donne aucun argument "refspec" (c'est-à-dire quelque chose après un nom de référentiel). La valeur par défaut donne le comportement décrit ci-dessus.

Voici les valeurs possibles pour push.default:

  • nothing
    Cela vous oblige à fournir une «refspec».

  • matching(valeur par défaut)
    Cela pousse toutes les branches qui existent à la fois dans le référentiel source et le référentiel de destination.
    Ceci est complètement indépendant de la branche actuellement extraite.

  • upstreamou tracking
    (Les deux valeurs signifient la même chose. La dernière a été dépréciée pour éviter toute confusion avec les branches de "suivi à distance". La première a été introduite dans 1.7.4.2, donc vous devrez utiliser la seconde si vous utilisez Git 1.7.3.1. )
    Ceux-ci poussent la branche courante vers la branche spécifiée par sa configuration «amont».

  • current
    Cela pousse la branche actuelle vers la branche du même nom dans le référentiel de destination.

    Ces deux derniers finissent par être les mêmes pour les cas courants (par exemple travailler sur un maître local qui utilise origine / maître comme son amont), mais ils sont différents lorsque la branche locale a un nom différent de sa branche «en amont»:

    git checkout master
    # hack, commit, hack, commit
    
    # bug report comes in, we want a fix on master without the above commits
    
    git checkout -b quickfix origin/master  # "upstream" is master on origin
    # fix, commit
    git push
    

    Avec push.defaultégal à upstream(ou tracking), la poussée irait originde » maître de la branche. Lorsqu'il est égal à current, le push irait à originla branche quickfix de .

Le matchingparamètre mettra à jour barele maître de votre scénario une fois qu'il aura été établi. Pour l'établir, vous pouvez utiliser git push origin masterune fois.

Cependant, le upstreamparamètre (ou peut-être current) semble être mieux adapté à ce que vous attendez, vous pouvez donc l'essayer:

# try it once (in Git 1.7.2 and later)
git -c push.default=upstream push

# configure it for only this repository
git config push.default upstream

# configure it for all repositories that do not override it themselves
git config --global push.default upstream

(Encore une fois, si vous utilisez toujours un Git avant 1.7.4.2, vous devrez utiliser à la trackingplace de upstream).

Chris Johnsen
la source
1

J'utilise le client git SourceTree et je vois que leur commande initiale commit / push est:

git -c diff.mnemonicprefix=false -c core.quotepath=false push -v --tags --set-upstream origin master:master
IgorGanapolsky
la source