Trabalhando com Git em várias máquinas

15

Isso pode parecer um pouco estranho, mas estou pensando em uma boa maneira de trabalhar no Git a partir de várias máquinas conectadas em rede de alguma maneira. Parece-me que tenho duas opções e posso ver benefícios de ambos os lados:

  • Use o próprio git para compartilhar, cada máquina tem seu próprio repositório e você deve buscar entre elas.
    • Você pode trabalhar em qualquer máquina, mesmo que a outra esteja offline. Isso por si só é bem grande, eu acho.
  • Use um repositório compartilhado pela rede entre máquinas.
    • Não é necessário executar git pull toda vez que você muda de máquina, pois seu código está sempre atualizado.
    • Não se preocupe, pois você esqueceu de enviar o código da outra máquina que não é de hospedagem, que agora está fora de alcance, pois você estava trabalhando em um compartilhamento de arquivos nessa máquina.

Minha intuição diz que todo mundo geralmente escolhe a primeira opção. Mas a desvantagem que vejo é que nem sempre você pode acessar o código de suas outras máquinas e certamente não quero enviar todas as minhas ramificações WIP para o github no final de cada dia. Também não quero ter que deixar meus computadores ligados o tempo todo para poder buscá-los diretamente. Por fim, um ponto secundário é que todos os comandos git para manter várias ramificações atualizadas podem ficar entediantes.

Existe um terceiro controle sobre essa situação? Talvez algumas ferramentas de terceiros estejam disponíveis para ajudar a facilitar esse processo? Se você lida com essa situação regularmente, o que sugere?

Tesserex
fonte
O git é uma ferramenta de versão descentralizada e o git sempre faz uma cópia local do seu repositório ao clonar, o conceito sobre um repositório "centralizado" ou "exclusivo" simplesmente não existe no mundo do git em termos globais.
user827992
2
@ user827992 Estou 100% ciente desse fato. Acho que não sugeri nada sobre centralização. A única coisa a que me referi é que, se você estiver usando um compartilhamento de arquivos, uma máquina é o host, no sentido de que está armazenando fisicamente os arquivos. Esse é um conceito totalmente separado dos dvcs.
Tesserex
este thread stackoverflow.com/questions/1550378/… contém alguns bons pensamentos. Cometendo, empurrar, puxar, redefinir e excluir o ramo é um deles (possivelmente automatizado)
phil294

Respostas:

14

Lido com as duas soluções propostas diariamente. Existem dois conceitos principais para lidar bem com eles.

  1. Use ramificações de tópicos. Eu acredito que a história da produção deve ser primitiva. Como resultado, gasto muito tempo tornando productiono histórico da minha filial lógico, replicável e depurável. Ao usar várias máquinas, no entanto, você ocasionalmente precisa confirmar o trabalho em andamento. Use uma ramificação de tópico. Você pode pulle pushesse ramo a partir de ambas as máquinas com pouco esforço e quando estiver pronto para mesclar masterou production refazê-lo para criar um histórico mais sustentável.
  2. Usar um repositório compartilhado em uma rede é bom, a menos que você também o compartilhe com outros usuários. Usamos um repositório compartilhado para scripts, denominado criativamente o scriptsrepositório. No começo, parecia uma boa idéia, pois o repositório não muda com frequência, mas com o tempo se tornou um pesadelo. É fácil sobrescrever o trabalho um do outro e você acaba gastando tanto tempo com o tráfego aéreo controlando quem está implantando o repositório quanto o que trabalha nele.

A melhor solução é manter um repositório local em cada máquina e compartilhar ramificações de tópicos entre eles por meio de um controle remoto. Confirme o trabalho em andamento nessas ramificações quantas vezes quiser. Desde que você esteja disposto a rebaseentrar em uma história mais inteligível, é bastante eficaz na prática.

Se você estiver trabalhando em mais de uma ramificação de tópico ao longo do dia, mas não quiser enviar cada uma individualmente para o controle remoto, git push <remote>por padrão , enviará todas as ramificações correspondentes para <remote>. Esse padrão será alterado em uma versão posterior do git , mas poderá ser substituído, definindo push.defaultum arquivo de configuração ou especificando a correspondência refspec:

git push <remote> :
Christopher
fonte
3

Se nem todas as máquinas estiverem ativadas o tempo todo, não há uma bala de prata: antes de desligar a máquina, é necessário fazer as alterações em outro lugar. Eu envio para um servidor privado, mas pode ser também dropbox ou uma chave USB que você carrega em qualquer lugar.

Sim, empurrar várias ramificações para um local central pode ser entediante, mas isso não deve ser muito difícil de script. Eu uso um push.shscript para isso, que corro toda vez que trabalho em uma máquina.

janos
fonte
2

Cheguei a isso de uma direção um pouco diferente (e uso mercurial, mas filosoficamente é o mesmo). Esta não é minha ideia, apenas a uso e funciona para minhas coisas pessoais.

Criei um clone de meus repositórios em uma pasta SkyDrive (poderia ser também dropbox ou outra ferramenta de sincronização mágica de sua escolha); em seguida, configurei as instâncias em minhas duas máquinas para enviar automaticamente para o repositório SkyDrive ao confirmar.

Quando eu troco de caixa, é apenas uma questão de puxar e atualizar - em teoria, você sempre estará trabalhando de maneira linear, mesmo que em vários repositórios.

A chave aqui é que o repositório SkyDrive existe principalmente para fornecer um meio de garantir que eu tenha acesso a mais ou menos a versão mais recente do código em ambas as minhas máquinas - embora funcione bem para mais - e fornecer um backup extra. Tudo o que é "feito" é enviado para o Kiln (se eu estivesse usando o git e entendesse corretamente a maneira como o jogo é jogado, seria o ponto em que eu faria uma nova rebase).

O que eu realmente não gostaria de fazer é executar uma pasta compartilhada ... se você estiver usando um DVCS, poderá aproveitar o benefício.

Murph
fonte
0

A primeira de suas duas alternativas é a resposta. Isso está implícito no "D" no "DVCS". Cada usuário tem sua própria instância local do repositório, e os repositórios conversam entre si de maneiras gerenciáveis.

Você poderia fazer sua segunda alternativa, mas o problema é que existe apenas um diretório de trabalho do repositório. Portanto, a árvore de trabalho pode estar em apenas um estado de cada vez - não há Joe trabalhando em um ramo e Jane trabalhando em outro. Assim, os desenvolvedores podem substituir as alterações uns dos outros, alterar o trabalho um do outro. Ora, é como não ter controle de versão!

Existe um meio termo chamado, ter um repositório vazio em uma unidade de rede e ter usuários individuais fazendo check-in e check-out dele. Isso separa seu trabalho WIP (que sim, você mantém localmente) do trabalho que você publica no repositório. Não é "salvar" - é "publicar". O trabalho que você deseja que seus colegas vejam e usem.

Dan Ray
fonte