Como concluir um clone do git para um grande projeto em uma conexão instável?

193

Estou tentando clonar a base de código do LibreOffice, mas no momento tenho uma conexão de internet de cerca de 300kbps e é tudo menos estável. Posso recuperar a conexão a qualquer momento, mas o processo de clone do git já parou de funcionar e não há como fazê-la funcionar novamente. Existe alguma maneira de obter um download de clone do git mais resistente a falhas?

Uma opção que me considerei é baixar o diretório .git de outra pessoa, mas isso depende demais dos outros e não parece a melhor solução possível para mim.

LaPingvino
fonte
6
Você precisa clonar todas as revisões ou apenas as mais recentes? Talvez depth -1seja uma solução?
takeshin
1
A abordagem de pacote já está em vigor para repos kernel/git/torvalds/linux.git. E um clone git recuperável está sendo discutido (março de 2016). Consulte stackoverflow.com/a/29192890/6309 .
VonC 03/03
Eu me pergunto. Não vai fazer git init, configurar um controle remoto e, em seguida, buscar até conseguir fazer o truque? Não acho que a busca descarte objetos baixados com êxito se a conexão falhar.
01
@ АндрейБеньковский alguém já tentou isso?
William Entriken

Respostas:

71

Eu não acho que isso esteja pronto ainda. Há uma página antiga do GSoC que planejava implementar o recurso desejado. Minha melhor aposta é que, como você sugeriu, faça o download como um diretório. Suponho que você consiga retomar downloads por outros protocolos.

Clone reinicializável

Ao clonar um repositório grande (como o KDE, o Open Office, o kernel do Linux), atualmente não há como reiniciar um clone interrompido. Pode levar um tempo considerável para um usuário no final de um canal pequeno fazer o download dos dados e, se o clone for interrompido no meio, o usuário precisará reiniciar no início e tentar novamente. Para alguns usuários, isso pode impossibilitar a clonagem de um repositório grande.

Objetivo: Permitir que o git-clone retome automaticamente um download com falha anterior sobre o protocolo git: // nativo. Idioma: C Mentor: Shawn Pearce Sugerida por: Shawn Pearce on gmane


Atualizar

Juntamente com a git clone --depth=1sugestão de clonagem superficial ( ) em uma das outras respostas, pode ser útil se alguém puder criar um repositório simples para você, se você puder se comunicar com o provedor. Você pode facilmente converter o repositório vazio em um repositório completo. Leia também os comentários nessa resposta, pois um clone superficial nem sempre pode ajudar.

Caçador da selva
fonte
Obrigado pelas informações, para que meu problema seja conhecido e para que seja resolvida uma solução ... O que você recomendaria como solução alternativa?
LaPingvino 17/10/10
9
Bem, ontem, perdi minhas 600 rúpias (US $ 10) por causa desse problema. A largura de banda da Internet é uma coisa bastante preciosa na minha parte do mundo.
Amit Singh Tomar
2
Muitas pessoas pedem atualizações e ninguém compartilha sua contribuição para a solução.
William Entriken
2
18 de março - lukin por isso ainda ... nesta terra !!
earthling 23/03
3
11 anos depois, o ataque do Google à questão socioeconômica subjacente da largura de banda não confiável com o Google Fiber e o Google Fi teve resultados mistos. Suas micro-trincheiras de fibra na cidade de Louisville foram cortadas muito superficialmente no asfalto, e os cabos foram encontrados saindo da superfície da estrada logo após o trabalho. Enquanto isso, --depth 1e --unshallowparece ter resistido aos anos de uso.
rwong 8/02/19
126

Duas soluções (ou melhor, soluções alternativas ) que vêm à mente são:

  • Uso raso clone isto é git clone --depth=1, em seguida, aprofundar este clone utilizando git fetch --depth=N, com o aumento da N . Você pode usar git fetch --unshallow(desde 1.8.0.3) para baixar todas as revisões restantes.

  • Peça a alguém para empacotar um release marcado (consulte a página de manual do git-bundle (1) ). O pacote configurável em si é um arquivo comum, que você pode baixar de qualquer maneira, via HTTP / FTP com suporte a resumo, via BitTorrent, via rsync, etc. .

Jakub Narębski
fonte
3
O truque superficial do clone não funciona bem na prática. A clonagem de um repositório bem compactado (git: //libvirt.org/libvirt.git) altera uma transferência de 68M para uma transferência de 61M + 35M. Um recurso para priorizar a árvore de trabalho, em vez de todas as ramificações na profundidade 1, pode se sair melhor; a retomada da sessão seria melhor ainda.
Tobu
1
@Tobu: truque de clone raso pode funcionar em repositório com histórico longo. Há trabalho em andamento para fazer com que o clone superficial obtenha apenas uma única ramificação por padrão. Isso pode ter ajudado. Ou não.
Jakub Narębski 19/01/12
6
Isso funciona muito bem agora, com o git 1.7.10. A profundidade inicial = 1 clone do repositório Git é de apenas 4.72Mb, enquanto o repositório inteiro é de 55Mb. Buscas adicionais podem ser tão pequenas quanto você quiser (profundidade = 100 me deu uma busca de ~ 20Mb). O download total compactado foi de 31Mb, em um clone e três buscas.
naught101
2
@ naught101 Ele baixa objetos para uma revisão, e se o próprio código-fonte é grande (não história), então será um problema novo ...
kan
1
for m in $(seq 1 50);do git fetch --depth=$[m*100];donetrabalhou para mim, obrigado! :)
Trass3r 15/01/19
15

Este método usa um servidor de terceiros.

Primeiro, faça git clone --bare, então rsync -v -P -e ssh user@host:repo.git . você pode usar o msys no Windows.

Rafal Rusin
fonte
Eu tentei a opção --bare, ele criou o conteúdo esperado dos arquivos internos .git dentro do repo.git, tive que fazer o arquivo clone git: ///path/to/repo.git/ para obter o repositório real
PiyusG
1
Linus não é dono do GitHub ... por "servidor de terceiros", você realmente quis dizer "servidor Git que não prende seus usuários com tanta força que proíbe o uso deles rsync(1) pela maneira como estou olhando para você "? Ou, você pretende primeiro git clone em um servidor de terceiros e depois sincronizá-lo novamente com a máquina local?
11788 JamesTheAwesomeDude
9

Você pode "baixar o diretório .git de outra pessoa", mas com essa outra pessoa sendo o próprio repositório oficial. Os repositórios do LibreOffice estão disponíveis via http, por exemplo, build.gitem http://anongit.freedesktop.org/git/libreoffice/build.git/ (consulte http://cgit.freedesktop.org/libreoffice/ para obter a lista completa, o URL http está na parte inferior da página de cada repositório).

O que você vê nesses URLs http nada mais é do que um .gitdiretório (na verdade, um repositório " vazio ", que possui apenas o que você encontraria no .gitdiretório). É o mesmo diretório que o servidor para o git://protocolo ( git daemon) leria. Se você fizer uma cópia desses diretórios com um downloader da web (por exemplo wget -m -np), poderá clonar sua cópia e ela funcionará tão bem quanto se você tivesse clonado diretamente do repositório http.

Então, o que você pode fazer é: para cada repositório, obtenha uma cópia dele com o seu downloader da web favorito (que lidará com todos os problemas com a retomada de downloads quebrados) e clone a partir dessa cópia. Quando você quiser atualizar, use novamente o seu downloader da web favorito para atualizar sua cópia e retire a cópia. Agora seus clones e atualizações são tão resistentes a más conexões quanto o seu downloader da web favorito.

CesarB
fonte
Eles fizeram a conversão para apenas um repositório agora, tentando sua dica wget decide baixar o site de uma só vez no entanto ... (tentar novamente agora, provavelmente irá atualizar aqui mais tarde ...)
LaPingvino
Seu comando parece obter todos os links no site, e não é isso que deve acontecer. Eu comecei a escrever um script que parece funcionar aqui: gist.github.com/1307703 De qualquer forma, muito obrigado pela idéia inicial!
LaPingvino 23/10
Idéia interessante, estou tentando obter o repositório ruby ​​/ ruby ​​do github e estou sendo bloqueado pelo robots.txt ... alguma sugestão?
hanetzer
6

Vamos dividir git cloneem seus componentes e usá git checkout- los para impedir o download de arquivos novamente.

Quando git cloneexecutado, as primeiras coisas que faz são equivalentes a

git init
git remote add origin <repo_url>
git fetch origin <branch>

Se você executar as etapas acima manualmente e assumindo que elas foram concluídas corretamente, agora poderá executar o seguinte quantas vezes forem necessárias:

git checkout --force <branch>

Observe que ele fará o check-out de todos os arquivos sempre que for executado, mas você não precisará baixar novamente os arquivos , o que pode economizar muito tempo.

cowlinator
fonte
1
ele não funciona da maneira que você descreve, ele não permitirá que fazer um reset git após um quebrado buscar
MaikoID
Como eu disse, depois de assumir que uma busca foi concluída com êxito, você pode executar o git reset. Se sua busca estiver interrompida, a redefinição não funcionará. Você precisa A) tentar buscar repetidamente novamente até que funcione, ou B) abandonar isso e tentar outra coisa.
cowlinator
Eu fiz outra coisa que funcionou milagrosamente. Eu fiz um pull git em vez de git fetch =) #
MaikoID 11/11
@MaikoID Eu acredito que um git pull é apenas chamar git fetch internamente, e depois funde, de modo que o comando deve Ned ter feito a diferença
lucidbrot
4

Se você tiver acesso a um servidor de terceiros, poderá cloná-lo e copiá-lo.

Âmbar
fonte
4
git clone --depth <Number> <repository> --branch <branch name> --single-branch

Este comando me ajuda (Graças a Nicola Paolucci )

por exemplo

git clone --depth 1 https://github.com/gokhanmoral/siyahkernel3 --branch ics  --single-branch
Ahed Eid
fonte
4

Com base nas respostas baseadas em clone / profundidade - algumas linhas do bash fazem isso facilmente ...

git clone --depth=1 [email protected]:/var/git/whatever.git <directory> cd <directory> for m in `seq 1 100`;do git fetch --depth=$m;done

Stephen
fonte
Obrigado, parece funcionar, estou tentando clonar o Arduino, estava em 25% com cerca de 800MB e travou. o download de partes parece ser mais seguro, mas pode não precisar estar nas etapas 1, talvez 10 ou 50 seja melhor, dependendo de como é atualizado, imagine 80 mil arquivos, não deve ser escrito em tão poucas profundidades. Usando: para m emseq 1 10 1000 ; não git pull --depth = $ m; feito para obter passos de 10. PS Se eu fizer Ctrl + CI perder apenas o pacote atual, e eu posso começar tudo de novo
user3394963
3

Esse problema também me mordeu. No meu caso, há uma solução alternativa. Pode ou não ser aplicável no seu caso.

Às vezes, estou usando um telefone celular para iniciar operações git em um sistema remoto. Se meu wi-fi interromper, é claro, a sessão termina e o git descarta toda a operação de clone sem se recuperar. Mas como a conexão de Internet do meu sistema remoto com o git master é sólida, não há necessidade de o clone parar. Tudo o que preciso é de bom senso para desanexar o clone da sessão do terminal. Isso pode ser feito usando screen / tmux ou nohup / daemon. Portanto, é um mau funcionamento do liveware no meu caso.

Tony Sidaway
fonte
2

Use CNTRL Z para interromper a clonagem. Não feche o terminal, coloque o sistema / laptop em hibernação e continue depois pelo comando fg. Eu estava enfrentando esse mesmo problema hoje ao tentar clonar um repo frm github. Isso veio como uma economia de tempo para mim.

Jicksy John
fonte
2

Aumentar o tamanho do buffer ajudará você neste problema. Basta seguir os passos.

passos:

1. Abra o terminal ou Git Bash e, com "cd", vá para o local em que deseja clonar o repo.

2. Defina a compactação como 0

git config --global core.compression 0

Tamanho 3.Set postBuffer

git config --global http.postBuffer 1048576000

Defina o tamanho maxRequestBuffer

git config --global http.maxRequestBuffer 100M

Agora comece o clone

git clone <repo url>

6. Aguarde até que o clone seja concluído.

Obrigado. Feliz codificação !!!

Swapnil Naukudkar
fonte
Definitivamente, essa deve ser a resposta aceita. Resolve o problema.
SuperEye
1

Eu gostaria de colocar meus 5 centavos aqui. Foi isso que me ajudou a resolver esse problema

  • desativar a compactação
  • aumentar http.postBuffer
  • faça um clone parcial
  • navegue até o diretório clonado e busque o restante do clone
  • puxe o resto
git config --global core.compression 0
git config --global https.postBuffer 524288000
git clone  <your_git_http_url_here> --depth 1
git fetch --unshallow 
git pull --all

Isso me ajudou a clonar o repositório de ~ 3 GB na conexão adsl de 8 Mbps, é claro que tive que realizar buscas e tentativas algumas vezes, mas ainda assim ...

matson kepson
fonte
0

se considerarmos que os servidores têm boa largura de banda (e você tem um servidor), outra resposta é:

  1. criar seu próprio servidor usando o Server-Side Git Wrapper s'
  2. clone-o no seu servidor
  3. Fechá-lo usando o Server-Side Zip Archiver s'
  4. faça o download de e com o suporte ao Resumo do Lado do Servidor

mas isso só funciona com experiência muito básico Web-desenvolvimento;) e também que você precisa git.exeem sua Sever

Mestre superior
fonte
0

Mesmo problema aqui - eu tenho uma conexão à Internet realmente esquisita, geralmente não superior a 10-15 kb / seg :-P

Para mim, a maneira wget funcionou muito bem. Vá para o site do repositório onde está o botão verde "clonar ou baixar", clique nele e copie o link da opção de download ZIP.

Em seguida, insira o link no comando
wget : wget -c -m -np https://github.com/your/repository/archive/master.zip

Funciona como um encanto...

Arquivo X
fonte
0

a melhor solução alternativa que funcionou para mim:

Eu enfrentei o mesmo problema com uma conexão de internet ruim. Então, eu vim com a seguinte solução:

Criei um pequeno arquivo php no meu servidor para baixar o pacote como um arquivo zip:

<?php
$url = "https://codeload.github.com/CocoaPods/Specs/zip/master";
file_put_contents("coco.zip", fopen($url, 'r'));
?>  

<a href="coco.zip">coco.zip</a>

faça o download do arquivo zip usando qualquer gerenciador de downloads que suporte o currículo

Zorox
fonte
-1

Você pode tentar usar o mercurial com a extensão hg-git.

Se isso não funcionar, você pode usar git fetch <commit-id>para buscar apenas partes de um repositório git remoto (você pode buscar em um repositório git vazio, não há necessidade de criá-lo com clone). Mas você pode corrigir a configuração da ramificação (= criar ramificações de rastreamento local e remoto) ao usar essa abordagem.

Rudi
fonte