2011-05-27 37 views
262

¿Puede explicar qué está mal con este flujo de trabajo?¿Por qué no puedo presionar a este repositorio desnudo?

$ 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 push Siempre empuje al repositorio I clonado a partir de?

+0

No debería especificar que rama para empujar? – Rekin

+2

no después de un clon !!! una vez resuelto el problema, funciona muy bien y no es necesario especificar la rama ... solo en esta primera comprobación de un repositorio vacío ocurre esto, lo cual es MUY molesto ... deberían solucionar este problema. –

+0

Espero que esta publicación sea útil para alguien al intentar hacer lo anterior- http://samranga.blogspot.com/2015/07/create-git-bitbucket-repository-from.html?view=sidebar El error en la pregunta puede Aparecerán incluso cuando intente crear un repositorio git BitBucket a partir de un proyecto ya existente localmente –

Respuesta

446

Sí, el problema es que no hay confirmaciones en "descubierto". Este es un problema solo con el primer commit, si crea los repos en el orden (bare, alice). Intente hacer:

git push --set-upstream origin master 

Esto solo sería necesario la primera vez. Luego debería funcionar normalmente.

Como señaló Chris Johnsen, no tendrías este problema si tu push.default fuera personalizado. Me gusta el upstream/tracking.

+1

Estoy haciendo 'sudo apt-get upgrade git-core' y' sudo apt-get upgrade git' y creo que no es necesaria ninguna actualización. 'git --version' devuelve 1.7.3.1. ¿Alguna idea de lo que falta? Admito que actualmente 'apt-get update' no 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 los inconvenientes, usar un flujo de trabajo diferente o instalar el último paquete de git manualmente con o sin debian/ubuntu. –

+0

Ah, sí, olvidé que el software tarda un tiempo antes de que se empaquete. Soy un novato de Linux, proveniente de Windows y solía hacer clic aquí para instalar la versión más nueva. – ripper234

43

Si:

git push origin master 

empujará al repositorio desnudo.

Parece que su repositorio de alice no realiza el seguimiento correctamente.

cat .git/config 

Esto mostrará el control remoto y la bifurcación predeterminados.

Si

git push -u origin master 

Debe iniciar el seguimiento a distancia y que rama. No estoy seguro de si esa opción siempre ha estado en git.

17
git push --all 

es la forma canónica de llevar todo a un nuevo repositorio vacío.

Otra forma de hacer lo mismo es la creación de su nuevo repositorio, no desnuda y luego hacer un clon desnudo con

git clone --bare 

a continuación, utilizar

git remote add origin <new-remote-repo> 

en el original (no descubierto).

+0

Pero todavía no funciona en mi caso. – ripper234

+0

... ¿así que bajas la respuesta? Es la forma estándar de llevar todo a un repositorio nuevo y simple. Si no funcionó para ti, hay algún otro problema. – ebneter

+0

Tienes razón, probablemente no debería haberlo hecho, sé que solo estabas tratando de ayudar. Si lo editas, deshago mi voto negativo. – ripper234

7

probar este en su repositorio alice (antes de empujar):

git config push.default tracking 

O, configurar como predeterminado para el usuario con git config --global ….


git push hace por defecto en el repositorio origin (que normalmente es el repositorio desde el que se clonó el repositorio actual), pero no por defecto a empujar a los actuales rama toma por defecto empujando únicas ramas que existen en ambos el repositorio fuente y el repositorio de destino.

El push.default variable de configuración (ver git-config(1)) controla lo git push empujará cuando no se da ningún argumento “refspec” (es decir, algo después de un nombre de repositorio). El valor predeterminado proporciona el comportamiento descrito anteriormente.

Éstos son los valores posibles para push.default:

  • nothing
    Esto obliga a que se les suministre un “refspec”.

  • matching (por defecto)
    Esto empuja todas las ramas que existen tanto en el repositorio de código fuente y el repositorio de destino.
    Esto es completamente independiente de la rama que está actualmente desprotegida.

  • upstream o tracking
    (Ambos valores significan lo mismo. Cuanto más tarde se desaprobó para evitar confusiones con ramas “de seguimiento a distancia”. El primero fue introducida en 1.7.4.2, por lo que tendrá que utilizar este último si está usando Git 1.7.3.1.)
    Empujan la rama actual hacia 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 terminar siendo el mismo para los casos comunes (por ejemplo, trabajando en locales maestro que utiliza origen/master como su aguas arriba), pero son diferentes cuando la rama local tiene un nombre diferente de su “ aguas arriba”rama:

    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.default igual a upstream (o tracking), el empuje iría a origin 's maestro rama. Cuando es igual a current, la inserción iría a originquickfix branch.

El ajuste matching actualizará bare ‘s maestro en el escenario una vez que se ha establecido. Para establecerlo, puede usar git push origin master una vez.

Sin embargo, el ajuste upstream (o tal vez current) parece que podría ser un mejor partido para lo que se 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 

(De nuevo, si usted está usando un Git anterior a 1.7.4.2, necesitará usar tracking en lugar de upstream).

24

la respuesta de esta pregunta relacionada proporcionó la solución para mí ... era sólo un error tonto:

Recuerde que debe comprometerse primero!

https://stackoverflow.com/a/7572252

Si todavía no se ha comprometido a tu repositorio local, no es otra cosa que empujar, pero el mensaje de error Git a volver no le ayuda demasiado.

+6

¡Comprometerse primero! DOH! Gracias. ¡Los mensajes de error de Git son basura! – doug65536

1

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

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