Skip to main content

Leonardo Murça

Como fazer push para múltiplos repositórios no git com apenas 1 comando

Publicado em 11 de outubro, 2022

Última atualização 24 de março, 2024

Rosas amarelas

Fig. 1 - Rosas amarelas.

Repositório utilizados neste tutorial:

TL;DR

$ git clone git@github.com:leomurca/gh-remote.git
  • Adicione o remote do repositório secundário (gl-remote) ao diretório clonado;
$ git remote add gitlab git@gitlab.com:leomurca/gl-remote.git
  • Adicione um terceiro remote que será utilizado para fazer o push para todos os remotes ao mesmo tempo. Por conveniência, vamos nomeá-lo como all. Além disso, nomeie sua url como fetch-not-supported;
$ git remote add all fetch-not-supported
  • Adicione os remotes que você deseja que seu código seja enviado quando git push all <BRANCH> for executado;
$ git remote set-url --add --push all git@gitlab.com:leomurca/gl-remote.git
$ git remote set-url --add --push all git@github.com:leomurca/gh-remote.git
  • E, finalmente, para testar se está funcionando, altere algum código localmente, execute o comando abaixo e verifique seus dois remotes (esteja ciente da branch que você está usando. Em nosso exemplo, estamos usando o branch main).
$ git push all main
Enumerating objects: 5, done.
Counting objects: 100% (5/5), done.
Writing objects: 100% (3/3), 275 bytes | 91.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
To gitlab.com:leomurca/gl-remote.git
   584aa2b..1a17aa1  main -> main
Enumerating objects: 8, done.
Counting objects: 100% (8/8), done.
Delta compression using up to 10 threads
Compressing objects: 100% (2/2), done.
Writing objects: 100% (6/6), 512 bytes | 85.00 KiB/s, done.
Total 6 (delta 0), reused 0 (delta 0), pack-reused 0
To github.com:leomurca/gh-remote.git
   7e0fb66..1a17aa1  main -> main

Introdução

Este tutorial é bem direto sobre como simplificar a sincronização entre vários remotes git, recomendo salvá-lo em seus favoritos caso esqueça alguma etapa.

Por que fazer o psuh para múltiplos remotes git?

O principal caso de uso para usar vários remotes git é sincronizar suas alterações entre todos os espelhos usados como redundância para seu projeto. Se esse for o seu caso (ou mesmo se não for, mas você quer aprender algo novo), vamos mergulhar de cabeça.

Adicionando múltiplos remotes

Primeiro de tudo, você precisa ter o repositório git primário clonado em sua máquina local. Você também pode começar criando um repositório local e, em seguida, enviar para um remoto, mas para este tutorial, vamos simplificar. Então, vamos clonar nosso repositório primário, que no caso é o gh-remote.

Clonando o repositório (com o remote primário)

$ git clone git@github.com:leomurca/gh-remote.git

Depois de cloná-lo, verifique o remote padrão atribuído a ele.

$ git remote -v
origin  git@github.com:leomurca/gh-remote.git (fetch)
origin  git@github.com:leomurca/gh-remote.git (push)

Adicionando um segundo remote

You can notice that the default remote name assigned to the primary repo was origin, but you can also change it in the future. Right, now let’s just add the second remote (gl-remote) to the cloned folder and then list all the remotes afterwards;

Você pode notar que o nome padrão do remote atribuído ao repositório primário era origin, mas também pode alterá-lo no futuro. Certo, agora vamos apenas adicionar o segundo remote (gl-remote) na pasta clonada e depois listar todos os controles remotos;

$ git remote add gitlab git@gitlab.com:leomurca/gl-remote.git
$ git remote -v
gitlab  git@gitlab.com:leomurca/gl-remote.git (fetch)
gitlab  git@gitlab.com:leomurca/gl-remote.git (push)
origin  git@github.com:leomurca/gh-remote.git (fetch)
origin  git@github.com:leomurca/gh-remote.git (push)

Adicionando um terceiro remote (somente push)

Adicionaremos um terceiro remote que será usado para enviar para todos os remotes ao mesmo tempo. Por conveniência, vamos nomeá-lo como all. Além disso, como url, usaremos o valor fetch-not-supported. Depois disso, liste os remotes.

$ git remote add all fetch-not-supported
$ git remote -v
all     fetch-not-supported (fetch)
all     fetch-not-supported (push)
gitlab  git@gitlab.com:leomurca/gl-remote.git (fetch)
gitlab  git@gitlab.com:leomurca/gl-remote.git (push)
origin  git@github.com:leomurca/gh-remote.git (fetch)
origin  git@github.com:leomurca/gh-remote.git (push)

E, finalmente, adicionaremos os remotes que queremos que nosso código seja enviado quando git push all <BRANCH> for executado;

$ git remote set-url --add --push all git@gitlab.com:leomurca/gl-remote.git
$ git remote set-url --add --push all git@github.com:leomurca/gh-remote.git

Liste todos os remotes

Vamos ver o resultado final listando todos os remotes adicionados anteriormente.

$ git remote -v
all     fetch-not-supported (fetch)
all     git@gitlab.com:leomurca/gl-remote.git (push)
all     git@github.com:leomurca/gh-remote.git (push)
gitlab  git@gitlab.com:leomurca/gl-remote.git (fetch)
gitlab  git@gitlab.com:leomurca/gl-remote.git (push)
origin  git@github.com:leomurca/gh-remote.git (fetch)
origin  git@github.com:leomurca/gh-remote.git (push)

Fazendo push para múltiplos remotes

And now that everything is set up, let’s test if it is working: change some code locally, run the command below and check your both remotes (Be aware of the branch that you are using. In our example, we are using the main branch).

E agora que tudo está configurado, vamos testar se está funcionando: altere algum código localmente, execute o comando abaixo e verifique seus dois remotes (Fique atento à branch que você está usando. Em nosso exemplo, estamos usando a branch main main ).

$ git push all main
Enumerating objects: 5, done.
Counting objects: 100% (5/5), done.
Writing objects: 100% (3/3), 275 bytes | 91.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
To gitlab.com:leomurca/gl-remote.git
   584aa2b..1a17aa1  main -> main
Enumerating objects: 8, done.
Counting objects: 100% (8/8), done.
Delta compression using up to 10 threads
Compressing objects: 100% (2/2), done.
Writing objects: 100% (6/6), 512 bytes | 85.00 KiB/s, done.
Total 6 (delta 0), reused 0 (delta 0), pack-reused 0
To github.com:leomurca/gh-remote.git
   7e0fb66..1a17aa1  main -> main

Isso é tudo! Aproveite sua nova configuração git.

Extra

Quer fazer um fetch de vários remotes? Basta executar git fetch --all.