2011-09-21 13 views
13

Cuando creo un repositorio nuevo en mi repositorio de gitolite, siempre tengo que ingresar el siguiente comando antes de poder comenzar a enviar código al servidor.git push master de origen: refs/heads/master qué hace esto

git push origin master:refs/heads/master

¿Qué hacer?

Supongo que tiene que ver con la referencia de la cabeza no estoy seguro. ¿Alguien podría explicarme?

Respuesta

27

Hay tres partes en este comando:

git push 

Esto invoca el comando push

origin 

Esto da nombre a la distancia a la que está empujando. Este es uno de los controles remotos nombrados almacenados en .git/config (puede enumerarlos con git remote), una URL o el token . que significa el repositorio actual.

master:refs/heads/master 

Esto se llama un "refspec", y se puede leer sobre él en la página del manual de git push. Pero en general, se compone de dos partes, separadas por dos puntos. La primera parte es el nombre de una rama local, y la segunda parte es el nombre de una rama en el repositorio remoto (en este caso, origin). Este refspec particular podría acortarse a master:master.

En general, se pueden acortar las referencias aún más. Simplemente especificando master ya que el refspec es equivalente a usar el mismo nombre en el control remoto, entonces master es lo mismo que master:master.

+0

Gracias por esta explicación. Solo quiero agregar un enlace a la documentación de git en Refspec aquí: https://git-scm.com/book/en/v2/Git-Internals-The-Refspec Y también agregar que esta es una herramienta útil para empujando una rama, espacio de nombres o incluso repositorio diferente en la rama de un control remoto. He encontrado que esto es útil para automatizar el proceso de enviar activos estáticos a gh-páginas después de compilar con Jekyll para que admita complementos allí. – prufrofro

1

Configura el seguimiento para usted. Puede utilizar la taquigrafía para esto:

git push origin master 

La parte tras los dos puntos es el nombre de la rama en el repositorio remoto. Si lo omites, git supone que quieres el mismo nombre.

Espero que esto ayude.

2

El comportamiento predeterminado de git push, que es, presumiblemente, lo que describe como "presionar el código para el servidor", es presionar únicamente las ramas locales que tienen una rama correspondiente, por nombre, en el control remoto que está presionando. Cuando crea un nuevo repositorio, no tiene ramas, por lo que un simple git push no arrojará nada. Tienes que empujar explícitamente una rama por su nombre primero. A partir de entonces, el comportamiento predeterminado funcionará como esperabas.

P.S. En realidad, solo tienes que git push origin master. Lo que hace es enviar a tu maestro local al repositorio de gitolite como maestro, ya que no especificaste un nombre diferente. Si dijo git push origin master:foo, la rama que localmente llama "maestro" se conocería como "foo" en gitolite.

P.P.S. Puede cambiar el comportamiento de inserción predeterminado entre "nada", "coincidencia" (predeterminado), "seguimiento"/"ascendente" y "actual". Consulte la configuración de "push.default" en el git-config man page.

4

master:refs/heads/master es un refspec.

refspecs son de la forma +<src>:<dst>

Así que aquí es que el árbitro principal en tu repositorio local que está empujando a la refs/heads/master refspec en el control remoto (origen). master es la abreviatura de refs/heads/master en realidad.

De hecho, sólo se puede hacer mediante la cual git push origin master empujará maestro en su local para dominar en el control remoto. Solo cuando desee enviar una referencia diferente, debe especificar explícitamente la referencia de destino.

También solo git push tiene un comportamiento predeterminado, lo que probablemente no hubiera sido el caso antes de que hiciera la primera inserción y creara una rama (maestra) en el control remoto. Entonces, habría parecido que necesitas hacer el comando que mencionaste. Consulte el manual

Cuestiones relacionadas