sincronização do repositório git entre computadores, ao se mover?

89

Digamos que eu tenha um PC desktop e um laptop, e às vezes trabalho no desktop e às vezes trabalho no laptop.

Qual é a maneira mais fácil de mover um repositório git para frente e para trás?

Quero que os repositórios git sejam idênticos, para que eu possa continuar de onde parei no outro computador.

Gostaria de ter certeza de que tenho os mesmos branches e tags em ambos os computadores.

Obrigado johan

Nota: Eu sei como fazer isso com o SubVersion, mas estou curioso para saber como isso funcionaria com o git. Se for mais fácil, posso usar um terceiro pc como servidor clássico com o qual os dois pc: s podem sincronizar.

Nota: Ambos os computadores estão executando Linux.


Atualização :

Então, vamos tentar a ideia do XANI: s com um repositório git vazio em um servidor e a sintaxe de comando push do KingCrunch. Neste exemplo, há dois clientes e um servidor.

Portanto, vamos criar primeiro a parte do servidor.

ssh user@server
mkdir -p ~/git_test/workspace
cd ~/git_test/workspace
git --bare init

Então, de um dos outros computadores, tento obter uma cópia do repo com clone:

git clone user@server:~/git_test/workspace/
Initialized empty Git repository in /home/user/git_test/repo1/workspace/.git/
warning: You appear to have cloned an empty repository.

Em seguida, vá para esse repo e adicione um arquivo:

cd workspace/
echo "test1" > testfile1.txt
git add testfile1.txt
git commit testfile1.txt -m "Added file testfile1.txt"
git push origin master

Agora o servidor está atualizado com testfile1.txt.

De qualquer forma, vamos ver se conseguimos esse arquivo do outro computador.

mkdir -p ~/git_test/repo2
cd ~/git_test/repo2
git clone user@server:~/git_test/workspace/
cd workspace/
git pull

E agora podemos ver o arquivo de teste.

Neste ponto, podemos editá-lo com mais algum conteúdo e atualizar o servidor novamente.

echo "test2" >> testfile1.txt
git add testfile1.txt
git commit -m "Test2"
git push origin master

Em seguida, voltamos ao primeiro cliente e fazemos um git pull para ver o arquivo atualizado. E agora posso ir e voltar entre os dois computadores e adicionar um terceiro, se quiser.

João
fonte
Script de sincronização para automatizar o processo de uso do git para sincronizar de PC1 para PC2 rapidamente e com baixo uso de dados, mesmo em um ponto de acesso wi-fi de telefone celular (é centenas de vezes mais rápido que rsync para este caso de uso!): Stackoverflow.com/questions / 4948190 /…
Gabriel Staples

Respostas:

28

Acho que existem várias abordagens. Vou apenas descrever como lido com isso

Eu tenho um netbook como um servidor 24/7, que mantém vários repositórios git. De / para lá, empurro e puxo as alterações via SSH. Para acesso externo, uso dyndns.org. Funciona bem, principalmente porque tenho mais de dois sistemas, que precisam de acesso a alguns dos repositórios.

Atualização: um pequeno exemplo. Vamos dizer que meu netbook se chama "netbook". Eu crio um repositório lá

$ ssh [email protected]
$ cd ~/git
$ mkdir newThing
$ cd newThing
$ git init --bare

Na minha área de trabalho, vou criar um clone dele. Talvez eu adicione alguns arquivos também

$ git clone [email protected]:/home/username/git/newThing
$ git add .
$ git commit -m "Initial"
$ git push origin master

Nos meus portáteis farei (primeiro) o mesmo, mas para acesso remoto (de fora da minha LAN), também adicionarei o endereço externo.

$ git clone [email protected]:/home/username/git/newThing
$ git remote add externalName [email protected]:/home/username/git/newThing
$ git pull externalName master

É apenas a maneira como o git (/ git workflows) funciona. Você pode adicionar quantos repositórios remotos desejar. Não importa se dois ou mais se referem aos mesmos repositórios "físicos". Você não precisa de um "servidor" local próprio, pode usar qualquer servidor público, ao qual tenha acesso ssh. E é claro que você não precisa de nenhum servidor público, se não precisar de acesso externo. O repositório vazio também pode estar no sistema de desktop e você pode então criar um repositório de cópia de trabalho dentro do sistema de arquivos local.

$ mkdir myRepo; cd myRepo
$ git init --bare
$ cd /path/to/myProject
$ git remote add origin /path/to/myRepo
$ git add .; git commit -m "Initial"; git push origin master

Esta é a maneira, como eu lido com isso, e para mim funciona muito bem (se não for perfeito;))

Algo para ler: http://progit.org/ Livro realmente bom.-

KingCrunch
fonte
Como seria isso, quando você usa maneiras diferentes no repo? Você gostaria de esclarecer sua resposta com um exemplo?
Johan
Obrigado, esses exemplos esclareceram muito :)
Johan
6

Eu clonaria o repo de uma caixa para a outra e, em seguida, configuraria os dois repos para poder usar apenas git fetcha outra caixa.

Renomear o remoto de origincom o nome da outra caixa torna as ramificações remotas mais fáceis de ler.

Observe que apenas usando git fetch(e não git push), isso funciona bem com repositórios não básicos:

[user@foo repo]$ git fetch -v bar

[user@bar repo]$ git fetch -v foo
ndim
fonte
5

Maneira mais fácil: repositório central criado com --bare(sem arquivos em check-out, apenas coisas .git) ou github

"Distribuído" terá a seguinte aparência:

Configuração:

  1. No laptop: git remote add desktop ssh://user@desktop/home/user/repo/path
  2. No desktop: git remote add laptop ssh://user@laptop/home/user/repo/path

Sincronizando:

git pull laptop/desktop (push não funcionará muito bem em repositórios não básicos porque git não modificará os arquivos retirados ao enviar para repositório remoto)

Ou faça repo no pendrive;)

XANi
fonte
Tentei usar um repositório --bare, mas não consigo fazer todo o fluxo de trabalho direito.
Johan
Estou apenas começando com o git, indo do git local para o github e vice-versa, posso fazer até agora, mas o método computador-para-computador não consigo fazer funcionar. Pergunta idiota - quais credenciais devo usar user? Para o github, só preciso adicionar as chaves rsa-pub. Tentei adicionar rsa-pub para o computador do solicitante do clone em known_hosts, mas não funcionou ...
Dave
Esta é a maneira mais simples de sincronizar entre duas máquinas locais sem acessar continuamente um servidor remoto.
johnzachary
1

Que tal simplesmente usar rsync?

seriyPS
fonte
3
Eu usei o rsync por anos para manter três servidores sincronizados. Funciona, mas o rsync não oferece uma maneira de reverter as alterações depois de concluída a sincronização. Eu também perdi muitos arquivos dessa forma porque não li a saída do teste de forma próxima o suficiente e o rsync foi configurado para excluir arquivos que não estavam presentes no mestre. Desde então, mudei para o git e achei uma maneira muito mais segura de manter diretórios importantes em sincronia.
Cloudkiller
1

Você não poderia simplesmente criar um repositório remoto no GitHub, BitBucket ou GitLab? (As duas últimas empresas oferecem repositórios privados gratuitos e ilimitados). Ao terminar o dia de trabalho, basta usar git pushpara enviar suas alterações para o repositório remoto. Quando você chegar em casa, basta git pullcolocar as alterações do trabalho em sua máquina doméstica. Da mesma forma, quando terminar em casa, faça git pushe, quando voltar ao trabalho, faça git pull.

Estudante de faculdade
fonte
O problema de fazer dessa maneira é que força você a realizar commits (que irão para o histórico de commits) em trabalho incompleto, apenas para que você possa transferir seu código para outra máquina. Estou procurando uma maneira de fazer algo que seja tão simples quanto o jeito que você mencionou, mas não criar esses commits de lixo, e evitar ter que usar a -fopção perigosa com git pushpara sobrescrever commits de "transferência" de lixo.
Pulseczar
1

Qual é a maneira mais fácil de mover um repositório git para frente e para trás [entre 2 computadores]?

Cenário 1: Eu trabalho (edito código e arquivos) exclusivamente no PC1 mas quero ter uma cópia duplicada dos arquivos (ex: para construir toda a base de código) também no PC2.

Sincronize de PC1 para PC2 em <1 minuto em um ponto de acesso wi-fi usando <25 MB de dados:

Eu trabalho em um computador fraco com o qual viajo (um laptop), mas construo um computador mais poderoso localizado em outro lugar. Eu uso o git o tempo todo para sincronizar do meu laptop com o outro computador usando um script. Eu apenas digito este comando para executá-lo:

sync_git_repo_from_pc1_to_pc2

É isso aí! Geralmente, leva cerca de 25 MB de dados e cerca de 30 segundos a 1 minuto, mesmo ao usar um hotspot wi-fi de telefone celular e trabalhar em um repo com dezenas de gigabytes de tamanho. Estou conectado ao PC2, então o faço git log -1no PC2 para verificar se a sincronização funcionou e, a seguir, executo o comando build. Funciona perfeitamente. Dê uma chance. Veja os links abaixo para detalhes.

Observação: o repositório clonado no PC2 estará em um branch git chamado somename_SYNC. Modifique o script apropriadamente se desejar que tenha o mesmo nome de branch em vez de sempre usar um "branch SYNC". É possível modificar o script para obter um efeito mais parecido com o Cenário 2 abaixo, se desejado. No entanto, fazer o Cenário 2 manualmente não é difícil, então você pode querer continuar fazendo o Cenário 2 manualmente. É o Cenário 1 onde o script automatizado é o mais benéfico e economiza tempo, pois permite um fluxo de trabalho fácil e rápido de "modificar, sincronizar, construir" onde a "modificação" ocorre no PC1, a "sincronização" é executada no PC1, mas também afeta PC2 e a "construção" ocorre no PC2.

Links:

  1. Configuração completa e instruções de instalação aqui:
    Trabalhe em um projeto remoto com Eclipse via SSH
  2. Leiame, documentação e repositório aqui: https://github.com/ElectricRCAircraftGuy/eRCaGuy_dotfiles/blob/master/useful_scripts/README_git-sync_repo_from_pc1_to_pc2.md .
  3. O script exato em questão está aqui:
    https://github.com/ElectricRCAircraftGuy/eRCaGuy_dotfiles/blob/master/useful_scripts/sync_git_repo_from_pc1_to_pc2.sh

Cenário 2: Eu trabalho (edito código e arquivos) em vários computadores e quero ser capaz de editar o mesmo repositório de código em qualquer computador do mundo:

Quero que os repositórios git sejam idênticos, para que eu possa continuar de onde parei no outro computador. Gostaria de ter certeza de que tenho os mesmos branches e tags em ambos os computadores.

  1. Vá para https://github.com e crie uma conta e, opcionalmente (recomendado), configure as chaves SSH .

  2. Agora use sua interface da web para criar um novo repositório.

    1. A partir do ano 2020 ou anterior, o GitHub permite repositórios privados gratuitos também, então isso funciona bem mesmo para projetos privados de código fechado.
  3. Encontre o novo ssh do repositório ou URL clone https. Ex: [email protected]: ElectricRCAircraftGuy / eRCaGuy_dotfiles.git ou https://github.com/ElectricRCAircraftGuy/eRCaGuy_dotfiles.git .

  4. Clone o projeto no PC1. Ex:

     [email protected]:ElectricRCAircraftGuy/eRCaGuy_dotfiles.git
     cd eRCaGuy_dotfiles
    
  5. E repita exatamente o mesmo comando de clone no PC2.

  6. Agora no PC1, faça algumas alterações, confirme-as e envie-as para seu repositório "remoto" no github:

     # edit some files, then do the following
     git add -A  # stage ("add") all changed files to be committed 
     git commit  # commit them
     git push    # push them to your remote github repo
    
  7. Agora no PC2, coloque suas alterações:

     # pull all changes from github (which includes the changes
     # you just pushed from PC1) to PC2
     git pull  
    
  8. Agora você pode editar arquivos no PC2, confirmá-los e enviá-los ao github usando os comandos mostrados apenas 2 etapas acima e, a partir do PC1, você pode executar git pullpara obter essas alterações do PC2.

  9. Continue fazendo este processo, conforme necessário, trabalhando no PC1 OU PC2 e facilmente compartilhando os arquivos e dividindo seu trabalho entre os dois computadores. Lembre-se de que todas as suas alterações devem ser confirmadas e enviadas por push para o github em um PC antes que você possa verificá-las (retirá-las) e continuar trabalhando no outro PC.

  10. Se você entrar em uma situação em que os arquivos estão um pouco fora de sincronia entre os dois PCs, talvez você precise usar alguns branches extras, fazer algumas mesclagens, resolver conflitos, etc. Então, torna-se mais semelhante ao trabalho com uma pequena equipe em que todos trabalham no mesmo repo. Google é seu amigo. Git é muito, muito poderoso e tem um comando, conjunto de comandos ou fluxo de trabalho para quase tudo.

Gabriel Staples
fonte
0

Bem, você pode enviar e receber (via Git) para o servidor que você poderia configurar. Ou você pode armazenar seus repositórios no GitHub e usá-los como uma ponte de sincronização.

mipadi
fonte
0

Você pode fazer o repositório em qualquer um dos seus computadores, provavelmente o desktop e empurrar / puxar para ele do laptop e de si mesmo.

Kerhong
fonte