En un post anterior hablé sobre mi preferencia sobre bitbucket para llevar mis proyectos sin embargo no puedo negar que github como herramienta no solo técnica sino social es muy útil, sobre todo como parte de nuestra carta de presentación para los que nos dedicamos al desarrollo de software, es por ello que hace tiempo pensé como podría seguir utilizando bitbucket pero al mismo tiempo tener presencia en github y esto es lo que hice.
Razones
Como ya comenté, github es para mi más que una herramienta técnica una red social de ingenieros, casi casi como LinkedIn. Esto lo digo porque actualmente diría que 8 de cada 10 buenas ofertas para programadores van a requerirnos compartir ejemplos de código o bien contribuciones a proyectos OpenSource y la mayoría le será más familiar e intuitivo github, otras razones son:
- Tener presencia en github
- Respaldo de tu código (una especie de mirror)
- Utilizar alguna otra herramienta o integración no disponible en bitbucket pero si en github
Como hacerlo
En realidad es bastante fácil, ya que git es un sistema de manejo de versiones descentralizado este nos permite tener tantos servidores remotos como querramos pues en realidad ninguno representa un servidor «central». De hecho, la única razón por la cual utilizamos un remote por ejemplo, es más a manera de respaldo y colaboración que otra cosa, bien podríamos no utilizar ninguno y seguir trabajando con un flujo de branches local.
Cuando hacemos algo como:
git remote add origin https://github.com/user/repo.git
En realidad simplemente le estamos indicando a git que deseamos registrar un nuevo servidor remoto de nombre origin al cual posiblemente hagamos push eventualmente.
En mi caso por ejemplo tengo mis repos originales en bitbucket del cual hice un git clone, si reviso los remotes de ese repo entonces tengo:
~: git remote -v origin git@bitbucket.org:gusrub/sw0rdfish-api.git (fetch) origin git@bitbucket.org:gusrub/sw0rdfish-api.git (push)
Como vemos hay dos líneas aunque solo tenemos un solo remote llamado origin pero si ponemos atención al final veremos que uno dice fetch y el otro dice push. Esto lo que indica es que no necesariamente estamos forzados a hacer el fetch desde el mismo source que cuando hacemos push pero usualmente así eso. Lo interesante de esto es que nos muestra el poder de git precisamente.
¿Qué pasaría si agregamos entonces otro remote para github? Veamos
~: git remote add origin git@github.com:gusrub/sw0rdfish-api.git fatal: remote origin already exists.
Exacto, ya existe un remote con el nombre de «origin» lo natural es que pensemos agregarlo con otro nombre, llamemosle github:
~: git remote add github git@github.com:gusrub/sw0rdfish-api.git
Si ahora revisamos la lista de remotes veremos lo siguiente:
~: git remote -v github git@github.com:gusrub/sw0rdfish-api.git (fetch) github git@github.com:gusrub/sw0rdfish-api.git (push) origin git@bitbucket.org:gusrub/sw0rdfish-api.git (fetch) origin git@bitbucket.org:gusrub/sw0rdfish-api.git (push)
El problema de agregar otro remote con nombre diferente es que, aunque funciona, requiere que hagamos «doble push», es decir, tendríamos que empujar dos veces nuestros cambios, uno por cada remote configurado, por ejemplo:
~: git push origin master ~: git push github master
El primer comando empuja al el branch hacia el remote llamado origin que apunta a bitbucket mientras que el segundo empuja el branch hacia el remote llamado github que, bueno, apunta a github. Lo deal sería simplemente poder hacer el clásico:
~: git push origin master
Y tener los cambios en ambos servicios. Y esto definitivamente es posible, para hacerlo, en vez de agregar otro nuevo remote simplemente modificamos el existente, pero primero eliminamos el que agregamos de github:
~: git remote remove github ~: git remote -v origin git@bitbucket.org:gusrub/sw0rdfish-api.git (fetch) origin git@bitbucket.org:gusrub/sw0rdfish-api.git (push)
Como vemos ya solo contamos con el remote de nombre origin original, ahora para agregar otro servidor o url al mismo remote hacemos:
~: git remote set-url --add --push origin git@github.com:gusrub/sw0rdfish-api.git ~: git remote set-url --add --push origin git@bitbucket.org:gusrub/sw0rdfish-api.git
Es importante notar que configuramos el remote dos veces: uno para github y el otro para bitbucket esto porque si solo corremos el primer comando el push url original, es decir el de bitbucket, será reemplazado por el del github, al ejecutar el segundo comando se vuelve a agregar el push url de bitbucket.
Ahora, cada vez que hagamos:
~: git push origin master
Los cambios se irán tanto a bitbucket como a github. Solo recordar que se configuró el push url, es decir, cuando hagamos fetch, solamente se leeran los cambios de bitbucket y no de github.
De esta manera es simple mantener nuestros repositorios sincronizados en ambos servicios.
Muchas gracias GUSTAVO. Fue muy util la explicacion. Podrias hacer tambien una guia para asignar en cada remoto el username y el password por defecto? Creo que tambien seria igual de util que esta explicacion tuya
Muchas gracias. Fué de mucha ayuda.