Al clonar un repositorio, Git añade una referencia en la configuración del repositorio clonado para incluir el repositorio “original” como “remote”. Este repositorio se denomina, por defecto, origin. De esta forma, si quieres enviar cambios a este repositorio, ejecutas el comando git push origin ${rama}.

En algunas situaciones te puede interesar trabajar con múltiples repositorios remotos, por lo que en esta entrada explico cómo revisar los repositorios remotos configurados en tu repositorio, cómo añadir y eliminar repositorios “remotos” adicionales, cambiarles el nombre, etc.

Revisando los repositorios remotos

Como decía, si has clonado tu repositorio local desde GitHub, por ejemplo, el repositorio “original” se ha añadido automáticamente como “remoto” con el nombre origin.

Git proporciona el subcomando remote con el que interaccionar con los repositorios remotos configurados.

Puedes consultar la ayuda para este comando mediante git remote --help o consultar el libro oficial con la documentación de Git en el capítulo 2.5 Git Basics - Working with Remotes. El libro está traducido a varios idiomas -entre ellos, el castellano- y puedes consultarlo libremente online.

Ejecutando el comando git remote a pelo:

$ git remote
origin

En la salida, se indica que hay un repositorio configurado con el nombre origin, pero no aporta demasiada información.

Añade -v o --verbose para que Git proporcione algo más de información:

$ git remote
origin  https://github.com/onthedock/onthedock-hugo.git (fetch)
origin  https://github.com/onthedock/onthedock-hugo.git (push)

En la salida vemos que el repositorio remoto origin aparece dos veces; al observar con más detalle, al final de la URL se indica la acción asociada a la URL; la primera URL corresponde a la acción de fetch (descarga de cambios desde el repositorio remoto hacia tu repositorio local) mientras que la segunda es para las acciones de push (envío de cambios de tu repositorio hacia el remoto).

Si quieres todavía más información sobre un repositorio remoto concreto, puedes usar git remote show, para el remoto en el que estás interesado.

$ git remote show origin
* remote origin
  Fetch URL: https://github.com/onthedock/onthedock-hugo.git
  Push  URL: https://github.com/onthedock/onthedock-hugo.git
  HEAD branch: master
  Remote branch:
    master tracked
  Local branch configured for 'git pull':
    master merges with remote master
  Local ref configured for 'git push':
    master pushes to master (up to date)

Repositorios remotos… o no

Aunque en realidad nos referimos al repositorio “de origen” como “remoto”, el repositorio puede estar en tu mismo equipo, en otra ruta. En el libro sobre Git, en 2.1 Git Basics - Getting a Git Repository tienes explicado con detalle cómo crear un repositorio de Git.

Si clonas un repositorio existente en tu equipo local mediante git clone /home/proyecto/ /home/copia-repo-proyecto/, donde /home/proyecto es la ruta a un repositorio local de Git, en el nuevo repositorio (el clon) la referencia al repositorio “remoto” origin apunta a /home/proyecto/.

Por tanto, un repositorio “remoto” en realidad es “otro repositorio” con el que tu repositorio sabe “contactar” y que tiene guardado en su “agenda de contactos” con el nombre origin.

Cambiar el nombre de un remoto

Si por cualquier motivo quieres cambiar el nombre de un repositorio remoto, es tan sencillo como lanzar el comando git remote rename.

Suponiendo que has clonado el respositorio original desde GitHub, puedes cambiar el nombre con el que se identifica el remoto de origin a github, por ejemplo:

git remote rename origin github

El comando no muestra ninguna salida si todo funciona correctamente; si quieres comprobarlo puedes usar de nuevo git remote -v:

$ git remote -v
github  https://github.com/onthedock/onthedock-hugo.git (fetch)
github  https://github.com/onthedock/onthedock-hugo.git (push)

Añadiendo un remoto adicional

Supongamos por un momento que eres un friky ;) y que tienes montado tu propio “github” personal en casa con Gitea, la versión mejorada de Gogs; has creado un repositorio en Gitea cuya URL es http://192.168.1.123/xavi/onthedock-gitea.git y quieres añadirlo como remote a tu repositorio mediante el comando git remote add:

git remote add gitea http://192.168.1.123/xavi/onthedock-gitea.git

Ahora, si compruebas los repositorios remotos:

$ git remote -v
gitea   http://192.168.1.123/xavi/onthedock-gitea.git (fetch)
gitea   http://192.168.1.123/xavi/onthedock-gitea.git (push)
github  https://github.com/onthedock/onthedock-hugo.git (fetch)
github  https://github.com/onthedock/onthedock-hugo.git (push)

Puedes añadir tantos repositorios remotos a tu repositorio como necesites en tu flujo de trabajo habitual.

Para obtener (vía fetch o envíar con push) cambios de/al repositorio remoto, debemos especificarlo explícitamente en el comando (en el caso de push también se requiere la rama).

Aunque en el ejemplo he nombrado los repositorios en función de su ubicación, podrían corresponder a entornos de desarrollo diferentes, como integracion y produccion o trabajo y cliente, etc… O incluso podrías cambiarle el nombre porque prefieres llamar a tus remotos de alguna manera “graciosa” (git push harder master, git push iamthebest dev)…

El nombre con el que identificas el repositorio remoto sólo es relevante en tu copia “personal” del repositorio.

Si en algún momento quieres eliminar un repositorio remoto, usa el comando git remote rm ${nombreRemoto}. Aunque eliminar un repositorio remoto no elimina ningún fichero local, sí que pierdes la capacidad de enviar u obtener cambios de ese repositorio (ya que Git no sabe cómo contactar con él).

Conclusión

Git gestiona la creación del remoto origin “por defecto” al realizar el clonado de un repositorio, por lo que en general, no es una tarea que debas realizar manualmente si habitualmente clonas repositorios existentes (o que otra persona ha generado previamente).

Si tienes que trabajar con múltiples repositorios remotos, Git proporciona una manera muy sencilla de organizarlos como quieras de manera que siempre sea evidente a/de qué repositorio remoto estás enviando/recibiendo cambios.