¿Por qué no puedo empujar a este repositorio desnudo?

283

¿Puedes explicar qué está mal con este flujo de trabajo?

$ 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'

¿No git pushsiempre empuja al repositorio desde el que cloné?

ripper234
fuente
¿No deberías especificar una rama para empujar?
Rekin
3
no despues de un clon !!! después de que se soluciona el problema, funciona muy bien y no es necesario especificar la rama ... solo en este primer pago de un repositorio vacío ocurre esto, lo cual es MUY molesto ... deberían solucionar este problema.
Dean Hiller
Espero que esta publicación sea útil para alguien cuando intente hacer lo anterior: samranga.blogspot.com/2015/07/... El error en la pregunta puede aparecer incluso cuando se intenta crear un repositorio git BitBucket desde un proyecto ya existente localmente
Samitha Chathuranga

Respuestas:

483

Sí, el problema es que no hay confirmaciones en "desnudo". Este es un problema con la primera confirmación solamente, si crea los repositorios en el orden (desnudo, alice). Trata de hacerlo:

git push --set-upstream origin master

Esto solo se requeriría la primera vez. Luego debería funcionar normalmente.

Como señaló Chris Johnsen, no tendría este problema si su push.default estuviera personalizado. Me gusta upstream / tracking.

Seth Robertson
fuente
1
Lo estoy haciendo sudo apt-get upgrade git-corey sudo apt-get upgrade gitcreo que no es necesaria una actualización. git --versiondevuelve 1.7.3.1. ¿Alguna idea de lo que falta? Admito que actualmente apt-get updateno funciona para mí, pero no hace mucho tiempo.
ripper234
1
@ ripper234: La versión actual de git es 1.7.5.3 Puede vivir con las molestias, usar un flujo de trabajo diferente o instalar el último git manualmente sin el paquete debian / ubuntu.
Seth Robertson
Ah, claro, olvido que el software tarda un poco en empaquetarse. Soy un novato de Linux, proveniente de Windows, y solía hacer clic aquí para instalar la versión más nueva.
ripper234
9
Con respecto a "La versión reciente no tiene este problema": incluso en las versiones recientes, el valor predeterminado para push no parece haber cambiado desde matching; tal vez has push.defaultestablecido en upstream/ tracking(o current) en tu ~/.gitconfig?
Chris Johnsen
44
Intenta git push origin master:masterhacerlo explícito. Si eso no funciona, verifique en qué rama se encuentra: git branchtal vez no haya realizado el primer compromiso o haya realizado ese compromiso en una rama que no sea master.
Seth Robertson
43

Si tu:

 git push origin master

empujará al repositorio desnudo.

Parece que tu repositorio de Alice no está rastreando correctamente.

cat .git/config

Esto mostrará el control remoto y la rama predeterminados.

Si tu

 git push -u origin master

Debería comenzar a rastrear ese control remoto y rama. No estoy seguro de si esa opción siempre ha estado en git.

serby
fuente
30

La respuesta de esta pregunta relacionada me proporcionó la solución ... fue un simple error:

¡Recuerde comprometerse primero!

https://stackoverflow.com/a/7572252

Si aún no se ha comprometido con su repositorio local, no hay nada que presionar, pero el mensaje de error de Git que recibe no lo ayuda demasiado.

phpguru
fuente
17
git push --all

es la forma canónica de llevar todo a un nuevo repositorio desnudo.

Otra forma de hacer lo mismo es crear su nuevo repositorio no desnudo y luego hacer un clon desnudo con

git clone --bare

luego usa

git remote add origin <new-remote-repo>

en el repositorio original (no desnudo).

ebneter
fuente
... así que rechazaste la respuesta? Que es la forma estándar para empujar todo a un nuevo repositorio, desnudo. Si no funcionó para usted, hay algún otro problema.
ebneter
Tienes razón, probablemente no debería haberlo hecho, sé que solo estabas tratando de ayudar. Si lo editas, deshaceré mi voto negativo.
ripper234
Gracias, lo edité con otra forma de lograr la misma tarea.
Ebneter
Su respuesta me ayudó a agradecer;) Pero al final del comando, la ruta debe estar presente así: git push --all ../test_repola URL del repositorio al final del comando;)
Metafaniel
@Metafaniel Eso depende de cómo lo configures. Si su repositorio local ya tiene el control remoto configurado correctamente, "git push --all" debería funcionar como está.
ebneter
7

Pruebe esto en su alicerepositorio (antes de presionar):

git config push.default tracking

O configúrelo como predeterminado para su usuario con git config --global ….


git pushel valor predeterminado es el originrepositorio (que normalmente es el repositorio desde el que clonó el repositorio actual), pero no lo hace de forma predeterminada para empujar la rama actual; de manera predeterminada, empuja solo las ramas que existen tanto en el repositorio de origen como en el repositorio de destino.

La push.defaultvariable de configuración (ver git-config (1) ) controla lo git pushque empujará cuando no se le dé ningún argumento "refspec" (es decir, algo después de un nombre de repositorio). El valor predeterminado proporciona el comportamiento descrito anteriormente.

Aquí hay posibles valores para push.default:

  • nothing
    Esto te obliga a proporcionar una "refspec".

  • matching(el valor predeterminado)
    Esto empuja todas las ramas que existen tanto en el repositorio de origen como en el de destino.
    Esto es completamente independiente de la rama que está actualmente desprotegida.

  • upstreamo tracking
    (Ambos valores significan lo mismo. El último se desaprobó para evitar confusiones con las ramas de "seguimiento remoto". El primero se introdujo en 1.7.4.2, por lo que tendrá que usar el último si está usando Git 1.7.3.1. )
    Estos empujan la rama actual a la rama especificada por su configuración "ascendente".

  • current
    Esto empuja la rama actual a la rama del mismo nombre en el repositorio de destino.

    Estos dos últimos terminan siendo los mismos para casos comunes (por ejemplo, trabajando en un maestro local que usa origen / maestro como su flujo ascendente), pero son diferentes cuando la rama local tiene un nombre diferente de su rama "flujo ascendente":

    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
    

    Con push.defaultigual a upstream(o tracking), el empuje iría a originla rama maestra de ' . Cuando es igual a current, el empuje iría a originla rama de arreglo rápido .

La matchingconfiguración actualizará bareel maestro en su escenario una vez que se haya establecido. Para establecerlo, puedes usar git push origin masteruna vez.

Sin embargo, la upstreamconfiguración (o tal vez current) parece ser una mejor coincidencia para lo que espera que suceda, por lo que es posible que desee probarlo:

# 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

(Nuevamente, si todavía está usando un Git antes de 1.7.4.2, deberá usarlo en trackinglugar de upstream).

Chris Johnsen
fuente
1

Uso el cliente SourceTree git, y veo que su comando inicial commit / push es:

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