¿Es posible ver los controles remotos en git?

Tengo un git clone local de un repository. Por supuesto, puedo ver mi origin remoto local usando el git remote . Sin embargo, ¿puedo ver los controles remotos para mi origin remoto? ¿Puedo ver detalles sobre esos controles remotos, como la URL?

No en general, excepto a través del método en el comentario ( ssh al server y ejecutar git remote allí).

Sin embargo, puede ver todas las references 1 del control remoto, incluidas sus propias sucursales de seguimiento remoto, y a partir de esta información puede hacer algunas buenas suposiciones:

 $ git ls-remote From ssh:[networkingacted] d1574b852963482d4b482992ad6343691082412f HEAD 222c4dd303570d096f0346c3cd1dff6ea2c84f83 refs/heads/branch d1574b852963482d4b482992ad6343691082412f refs/heads/master d1574b852963482d4b482992ad6343691082412f refs/remotes/foo/bar d41117433d7b4431a188c0eddec878646bf399c3 refs/tags/tag-foo 

Lo anterior implica que la máquina en cuestión debe tener un control remoto llamado foo (del cual obtuvo una bar ramificación, renombrada a refs/remotes/foo/bar ). De hecho, no es así, ya que creé esa twig de seguimiento remoto manualmente antes de esto:

 $ cd ~/tmp/t $ git update-ref refs/remotes/foo/bar master $ git for-each-ref 222c4dd303570d096f0346c3cd1dff6ea2c84f83 commit refs/heads/branch d1574b852963482d4b482992ad6343691082412f commit refs/heads/master d1574b852963482d4b482992ad6343691082412f commit refs/remotes/foo/bar d41117433d7b4431a188c0eddec878646bf399c3 commit refs/tags/tag-foo 

1 Un control remoto puede ocultar references particulares ahora; en realidad solo ves a aquellos que permiten. El valor pnetworkingeterminado es permitir todo, sin embargo.

¡Loco! Especie de.

Por cierto, en el path descubrí que git update-ref -d sale con éxito incluso si no elimina nada (utilicé git update-ref -d para eliminar refs/remotes/foo/bar pero primero lo ejecuté en el repository incorrecto). Esto llevó a descubrir otro error menor:

 $ nullsha=0000000000000000000000000000000000000000 $ git update-ref -d refs/remotes/foo/bar $nullsha || echo bug 

(sin salida, bien: lo "borramos" con éxito mientras esperábamos que no existiera en primer lugar).

 $ git update-ref -d refs/remotes/foo/bar master && echo bug error: cannot lock ref 'refs/remotes/foo/bar': unable to resolve reference refs/remotes/foo/bar: No such file or directory 

Extraño: la eliminación debe (y lo hizo) fallar ya que la reference no existe, y mucho less coincide con el master , pero ese es un post bastante extraño. (Por cierto, estoy rompiendo largas queues para fines de publicación.)

 $ mastersha=$(git rev-parse master) $ git update-ref -d refs/remotes/foo/bar $mastersha 

El mismo post de falla; parece que no puede proporcionar un SHA1 esperado distinto de cero y tiene una falla "silenciosa". (El verdadero nombre-o-SHA-1 es irrelevante, excepto que el cero absoluto "hash nulo" significa "no existe", como suele ser el caso en Git).

¿Qué pasa con la creación, podemos esperar un null-hash para asegurarnos de que somos nosotros los que estamos creando el ref?

 $ git update-ref refs/remotes/foo/bar $mastersha $nullsha || echo bug 

Sin salida, bueno: debe crear solo si es nuevo, así que intentémoslo de nuevo y asegúrese de que la creación informe un estado distinto de cero:

 $ git update-ref refs/remotes/foo/bar $mastersha $nullsha && echo bug fatal: update_ref failed for ref 'refs/remotes/foo/bar': cannot lock ref 'refs/remotes/foo/bar': ref refs/remotes/foo/bar is at 11ae6ca18f6325c858f1e3ea2b7e6a045666336d but expected 0000000000000000000000000000000000000000 

Sin error real, pero otro post extraño. Al less tiene sentido, sin embargo.

¿Qué sucede si le pedimos que lo elimine, cuando esperamos que se elimine, pero no es así?

 $ git update-ref -d refs/remotes/foo/bar $nullsha && echo bug bug 

¡Vaya, pudimos eliminarlo! Por lo tanto, no intente utilizar null-hash para este propósito; no hay operación de eliminación atómica con el hash nulo, solo atomic-create. ( git update-ref -d falla correctamente si proporcionamos otro hash válido, pero no $mastersha , por lo que la eliminación atómica es una operación de dos pasos: analizar para get hash, luego intentar eliminar utilizando ese hash).