Control remoto pnetworkingeterminado para Git push

En Git-config puedes ver:

branch.name.remote

Cuando está en la twig <nombre>, le dice a git fetch y git push de qué control remoto va a search / push. El control remoto para presionar puede ser anulado con remote.pushDefault (para todas las twigs). El control remoto al que presionar, para la bifurcación actual, puede ser anulado por la bifurcación. <Nombre> .pushRemote. Si no se configura ningún control remoto, o si no se encuentra en ninguna bifurcación, su origen pnetworkingeterminado es ir a search y remote.pushDefault para presionar .

Ahora tengo un repository cloned y una twig que se llama test y está marcada . Aquí puede ver los contenidos del file de config del repository clonado:

 [core] repositoryformatversion = 0 filemode = true bare = false logallrefupdates = true [remote "origin"] url = ... fetch = +refs/heads/*:refs/remotes/origin/* [branch "master"] remote = origin merge = refs/heads/master 

Como ves, branch. test .pushRemote , remote.pushDefault y branch. test .remote no están establecidos allí. Así que espero cuando lo haga

 $ git push 

Conseguiré

 fatal: No configunetworking push destination. 

Pero yo obtengo

 Everything up-to-date 

Parece que Git usa origin lugar de no configurado remote.pushDefault . Pero por qué cuando dicen los doctores

el valor pnetworkingeterminado es remote.pushDefault para presionar .

Editar:

En Git-push puedes ver:

Cuando la línea de command no especifica dónde presionar con el argumento <repository>, se consulta la configuration remota de twig para la twig actual para determinar dónde presionar. Si falta la configuration, se establece de forma pnetworkingeterminada en el origen .

Cree que hay un conflicto entre el uso de origin y remote.pushDefault .

El código push de Git (y pull también, realmente) es (en mi opinión) innecesariamente complicado porque trata de mantener un gran número de comportamientos históricos, muchos de los cuales fueron malas ideas.

Veamos primero la sección REMOTOS de la documentation de git-push :

El nombre de uno de los siguientes se puede utilizar en lugar de una URL como argumento de repository :

  • un control remoto en el file de configuration de Git: $GIT_DIR/config ,

  • un file en el $GIT_DIR/remotes , o

  • un file en el $GIT_DIR/branches .

Todos estos también le permiten omitir el refspec de la línea de command porque cada uno contiene un refspec que git usará de forma pnetworkingeterminada.

(El nombre de un control remoto es -de nuevo, esta es solo mi opinión- el único de estos que realmente debería sobrevivir hoy. Creo que el método de URL especificada probablemente debería moverse a un command de fontanería, y git push podría volver a ser una secuencia de commands simple, aunque la gente de Git-on-Windows está, por desgracia, tratando de convertir lejos de las secuencias de commands debido a problemas de performance de Windows).

Afortunadamente, está utilizando el método remoto con nombre, por lo que podemos ignorar la mayor parte de esto. Específicamente, el refspec es opcional porque está utilizando un control remoto en $GIT_DIR/config .

A continuación, deberíamos distinguir claramente entre syntax (sustantivos y verbos y tal que ingrese en una línea de command) y semántica (comportamiento). Una vez que arrojamos las variedades adicionales de "control remoto" nos quedan dos tareas:

  1. Seleccione un control remoto
  2. Seleccione un refspec.

La syntax que git push fue git push , es decir, no se especificó el argumento del repository y no se especificó refspec . Entonces, para el paso 1, seleccionando un control remoto, Git usa el párrafo que citó en su edición: encuentre la bifurcación actual, en este caso, test y luego busque branch.test.remote . Esto no está configurado (es "perdido"), por lo que Git recurre al origin .

(Hay un error en el párrafo de la documentation citada, ya que no menciona branch. branch .pushRemote , que en este caso sería branch.test.pushRemote . La secuencia correcta es (1) search el pushRemote específico de twig; ) busque el control remoto específico de sucursal; (3) busque remote.pushDefault si Git versión 1.8.3 o posterior; (4) pruebe el origin la palabra. Esta falla de documentation aún se encuentra en git 2.8.1.)

Como el origin es un nombre remoto válido, el paso 1 tiene éxito y pasamos al paso 2, seleccionando un refspec. Esta parte no lo tiene desconcertado, sino solo para completarlo:

Cuando la línea de command no especifica qué empujar con refspec ... arguments o --mirror , --mirror , --tags opciones, el command encuentra el refspec pnetworkingeterminado consultando remote.*.push configuration, y si no es así found, honra la configuration push.default para decidir qué push (ver git-config(1) para el significado de push.default ).

Entonces, en este caso, Git busca remote.origin.push y, como eso no está configurado, push.default . Si push.default no está configurado, existe un "valor pnetworkingeterminado pnetworkingeterminado", que en Git anterior a 2.0 matching y ahora es (Git 2.0 o posterior) simple . Este push.default pnetworkingeterminado significa que siempre hay un refspec.

El origen pnetworkingeterminado del nombre remoto significa que generalmente hay un control remoto. Esto falla solo cuando no hay una sección [remote "origin"] en su $GIT_DIR/config .

Si nos fijamos en la explicación de remote.pushDefault :

remote.pushDefault
El control remoto para presionar por defecto. Anula la twig. .remote para todas las twigs, y se reemplaza por twig. .pushRemote para twigs específicas.

Por lo tanto, está destinado a anular el control remoto pnetworkingeterminado al presionar. Cuando no está configurado, no hace nada, y el control remoto pnetworkingeterminado de origen entra en juego.

Tenga en count que remote.pushDefault se agregó más tarde (v1.8.3), por lo que se romperían muchas cosas cuando esta semántica cambiara.