Como fazer o git agrupar um repo completo

116

Preciso transferir um repositório completo para uma nova máquina sem rede, de preferência como uma entidade de arquivo único. O pacote git permite que um git fetch, git pulloperação estilo em um ambiente sneakernet mas parece assumir que você já tem uma versão de trabalho do repo na máquina de destino.

Qual é a invocação certa para:

  1. Empacote todas as filiais no repositório atual
  2. Inicie o novo repo no diretório de destino, ou seja, instale o commit root corretamente

Enviei um patch upstream para esclarecer:

`git clone` can use any bundle created without negative refspecs
(e.g., `new`, but not `old..new`).
If you want to match `git clone --mirror`, which would clone other
refs such as `refs/remotes/*`, use `--all`.
If you want to provide the same set of refs that a clone directly
from the source repository would get, use `--branches --tags` for
the `<git-rev-list-args>`.

Portanto, $ git bundle create repo.bundle --branches --tagsmelhor corresponde à clonagem.

$ git bundle create repo.bundle --all irá fornecer uma imagem espelhada de sua máquina de origem, incluindo seus refs remotos.

Philip Oakley
fonte

Respostas:

189

Qual é a invocação certa para:

  • Empacote todas as filiais no repositório atual

Simples:

$ git bundle create repo.bundle --all

Aqui repo.bundleestá o nome do arquivo de pacote que você deseja criar. Observe que --allnão incluiria branches de rastreamento remoto ... assim como o clone comum também não.

  • Inicie o novo repo no diretório de destino, ou seja, instale o commit root corretamente

Primeiro, cloneé apenas init+ fetch(+ administrativia).

Em segundo lugar, você pode usar o arquivo de pacote em qualquer lugar em que o URL do repositório possa ser usado, para que possa simplesmente a clonepartir de um arquivo de pacote:

$ git clone repo.bundle

Isso criaria repoum repositório git.

Jakub Narębski
fonte
6
Obrigado, as --allopções não estão em minha página de manual para bundle(estou procurando a versão 1.7.6.msysgit.0), nem o uso do arquivo .bundle na seção de URLs para clone. Isso me dá mais confiança para recomendar seu uso.
Philip Oakley
20
A sinopse do comando de criação é git bundle create <file> <git-rev-list-args>. Correr man git-rev-list(ou man git-log) lhe daria --all. Mas eu concordo que deveria ser mais visível na documentação do comando bundle.
Jakub Narębski
1
Vejo que a página man do bundle, em Especificando Referências, diz que "irá empacotar apenas as referências que são mostradas por git show-ref", o que não inclui [list] as opções de git-rev-list.
Philip Oakley
2
@Philip Oakley: git-rev-list-argsÉ assim que você seleciona referências que são mostradas por git show-refcomando.
Jakub Narębski
2
--allincluiu branches de rastreamento remoto para mim (git 2.1.4). Eu poderia ver refs/remotes/origin/*com git bundle list-heads bundlefileou git ls-remote bundlefile. Embora retirá-los do pacote seja um pouco complicado.
Alex
32

Primeiro clone o repositório e inclua a --mirroropção.

git clone --mirror [email protected]:path/repo.git

Isso garante que todas as ramificações remotas também sejam agências locais prontas para agrupamento.

Então corra

git bundle create repo.bundle --all conforme descrito pela resposta de Jakub Narębski

thoutbeckers
fonte
3

Eu sugeriria que você tar ou zipar a pasta .git e simplesmente descompactá-la no novo local e fazer git reset --hard HEAD. Tudo o que é necessário para todos os branches está em .git e tudo o que você precisa fazer é ajustar quaisquer controles remotos no arquivo .git / config ou removê-los.

tar cf myrepo.tgz .git
cp myrepo.tgz [USB_STICK]
... move to new machine ...
mkdir myrepo && cd myrepo
tar xpf [USB_STICK]/myrepo.tgz
git reset --hard HEAD
patthoyts
fonte
4
Uma ressalva é que você precisará examinar o arquivo .git / config para verificar se o proprietário do repo original tinha algum material específico do usuário nele.
Noufal Ibrahim
@patthoyts: Dado que está desconectado, não haveria remotos ;-) Parece que o pacote está (pode estar) faltando uma opção e talvez clone (preciso pensar em clonar de um pacote)
Philip Oakley