ti-enxame.com

Como usar o git-bundle para manter o desenvolvimento sincronizado?

Preciso manter minhas árvores de desenvolvimento sincronizadas em computadores diferentes, sem conexão de rede entre eles.

Temos um repositório central do git e normalmente trabalho no meu próprio clone no computador do escritório. Às vezes, preciso fazer algum desenvolvimento em outro computador, que nunca está conectado à rede do escritório. Nenhum dos computadores está conectado à Internet. O desenvolvimento pode ser realizado nos dois computadores entre as sincronizações.

Li as páginas de ajuda de git-bundle , que parece ser a melhor ferramenta, mas não tenho muita certeza de como um bom fluxo de trabalho possa ser configurado.

Você pode me dar alguns conselhos ou dicas?

66
matli

Pacotes!

O fluxo de trabalho com o pacote configurável git será essencialmente o mesmo que qualquer outro fluxo de trabalho. Isso pode não parecer um conselho muito útil, mas aqui está: use o fluxo de trabalho que você normalmente usaria e substitua "Push/pull" por "leve um pacote aqui para outro em uma unidade flash e, em seguida, puxe".

A página de manual, na verdade, tem uma boa explicação para seguir em frente, embora seja mais um exemplo unidirecional. Por uma questão de integridade, aqui está uma versão ligeiramente modificada, mostrando como mover as informações nos dois sentidos:

# on hostA, the initial home of the repo
hostA$ git bundle create hostA.bundle --branches --tags

# transfer the bundle to hostB, and continue:
hostB$ git clone /path/to/hostA.bundle my-repo
# you now have a clone, complete with remote branches and tags
# just to make it a little more obvious, rename the remote:
hostB$ git remote rename Origin hostA

# make some commits on hostB; time to transfer back to hostA
# use the known master branch of hostA as a basis
hostB$ git bundle create hostB.bundle ^hostA/master --branches --tags

# copy the bundle back over to hostA and continue:
hostA$ git remote add hostB /path/to/hostB.bundle
# fetch all the refs from the remote (creating remote branches like hostB/master)
hostA$ git fetch hostB
# pull from hostB's master, for example
hostA$ git pull

# make some commits on hostA; time to transfer to hostB
# again, use the known master branch as a basis
hostA$ git bundle create hostA.bundle ^hostB/master --branches --tags
# copy the bundle to hostB, **replacing** the original bundle
# update all the refs
hostB$ git fetch hostA

# and so on and so on

O principal a ser observado é que você pode adicionar um pacote como um controle remoto e interagir com ele como faria com qualquer outro controle remoto. Para atualizar esse controle remoto, basta soltar um novo pacote configurável, substituindo o anterior.

Também adotei uma abordagem um pouco diferente para escolher uma base. A página de manual usa tags, sempre atualizadas com as últimas referências que foram transferidas para o outro host. Simplesmente usei as ramificações remotas, que se referem às últimas referências transferidas de o outro host. É um pouco ineficiente; você acabará agrupando mais do que precisa, pois está um passo atrás. Porém, as unidades flash são grandes, os pacotes são pequenos e o uso das referências que você já possui em vez de precisar dar um passo extra e tomar cuidado com as tags economiza muito esforço.

A única coisa que causa problemas aos pacotes é que você não pode enviar por push a eles e não pode "reformá-los". Se você deseja que o pacote seja baseado em uma nova base, é necessário recriá-lo. Se você quiser novos commits nele, precisará recriá-lo. Este aborrecimento dá origem à minha próxima sugestão ...

Repo em um pen drive

Honestamente, a menos que seu repo seja realmente grande, isso pode ser igualmente fácil. Coloque um clone nu em um pen drive e você pode pressionar e puxar dele a partir de ambos os computadores. Trate-o como sua conexão de rede. Precisa transferir para o repositório central? Conecte!

110
Cascabel

A resposta do @Jefromi foi ótima - 10x melhor do que os documentos do git, que se prolongam bastante sobre requisitos e ações incompreensíveis.

Ainda é um pouco complicado, então aqui está o caso mais simples de sincronizar uma vez (no meu caso: FROM: um laptop offline com cartão wifi quebrado, TO: uma área de trabalho com acesso à rede). Com base na resposta de @ Jefromi, isso parece funcionar bem:

AHEAD = máquina que está à frente por algum número de confirmações. ATRÁS = máquina para a qual você deseja copiar as confirmações

1. AHEAD: git-bundle create myBundleName.bundle --branches --tags

AMBOS: copie myBundleName.bundle (usando email, USB, o que for)

ATRÁS: (coloque o arquivo myBundName.bundle em qualquer lugar que você desejar fora a pasta do projeto)

2. BEHIND: cd [the project folder]
3. BEHIND: git pull [path to the bundle file]/myBundleName.bundle master

Contanto que você inclua o nome do ramo no final (por padrão, se você não estiver usando ramos, "mestre"), isso parece funcionar bem e não substitui nenhuma das referências internas no BEHIND - para que você ainda pode sincronizar de/para o mestre de origem.

ou seja, se o BEHIND tiver acesso à Internet, ainda é seguro:

(OPTIONAL) 4. BEHIND: git Push

... e atualizará o repositório principal, como se suas alterações tivessem sido feitas localmente, normalmente, no BEHIND.

9
Adam