Estou trabalhando com um repositório com um número muito grande de arquivos que levam horas para serem finalizados. Estou estudando a possibilidade de o Git funcionar bem com esse tipo de repositório agora que ele suporta checkouts esparsos, mas todos os exemplos que posso encontrar fazem o seguinte:
git clone <path>
git config core.sparsecheckout true
echo <dir> > .git/info/sparse-checkout
git read-tree -m -u HEAD
O problema com essa sequência de comandos é que o clone original também faz uma verificação geral. Se você adicionar -n ao comando clone original, o comando read-tree resultará no seguinte erro:
erro: a verificação esparsa não deixa nenhuma entrada no diretório de trabalho
Como fazer a verificação esparsa sem verificar primeiro todos os arquivos?
git worktree add --no-checkout
também funcionará (não apenasgit clone --no-checkout
) com o git 2.9 (apenas 2016). Veja minha resposta abaixoRespostas:
Em 2020, existe uma maneira mais simples de lidar com o check-out esparso sem precisar se preocupar com arquivos .git. Aqui está como eu fiz isso:
Note que requer a versão 2.25 do git instalada. Leia mais sobre isso aqui: https://github.blog/2020-01-17-bring-your-monorepo-down-to-size-with-sparse-checkout/
ATUALIZAR:
O
git clone
comando acima ainda clonará o repositório com seu histórico completo, embora sem fazer o check-out dos arquivos. Se você não precisar do histórico completo, poderá adicionar o parâmetro --thpth ao comando, assim:fonte
sparse-checkout --cone
recurso em stackoverflow.com/a/59515426/6309--filter
) à sua resposta aqui.--depth
parâmetro que nos permite fazer um clone superficial. Isso vai ajudar? @ Tao, não sei como usar--filter
neste caso, eu não tentei. Você poderia dar um exemplo ou postar outra resposta para este tópico?Observe que esta resposta faz o download de uma cópia completa dos dados de um repositório. O
git remote add -f
comando clonará todo o repositório. Na página do manual degit-remote
:Tente o seguinte:
Agora você descobrirá que possui um checkout "podado" apenas com arquivos do caminho / within_repo / para / desejar_subdir presente (e nesse caminho).
Observe que na linha de comando do Windows você não deve citar o caminho, ou seja, você deve alterar o sexto comando com este:
caso contrário, você receberá as aspas no arquivo de verificação esparsa e não funcionará
fonte
git remote add
comando baixa tudo, porque é o que-f
faz - diz para ele buscar imediatamente, antes de definir as opções de compra esparsa. Mas omitir ou reordenar isso não vai ajudar. As verificações esparsas afetam apenas a árvore de trabalho, não o repositório. Se você deseja que seu repositório faça uma dieta, é necessário examinar as opções--depth
ou--single-branch
.O clone do Git tem uma opção (
--no-checkout
ou-n
) que faz o que você deseja.Na sua lista de comandos, basta alterar:
Para isso:
Em seguida, você pode usar a verificação esparsa, conforme indicado na pergunta.
fonte
--depth <depth>
opção git clone. Isso fará o download apenas dos últimos<depth>
commits do histórico. Atualmente, não há como baixar parcialmente um único commit com o git, mas se o seu controle remoto o suportar, você poderá usá-logit archive --remote
para baixar conjuntos parciais de arquivos.Eu tive um caso de uso semelhante, exceto que eu queria fazer check-out apenas do commit de uma tag e remover os diretórios. O uso
--depth 1
torna muito escasso e pode realmente acelerar as coisas.fonte
Encontrei a resposta que estava procurando no one-liner publicado anteriormente por pavek (obrigado!). Por isso, queria fornecer uma resposta completa em uma única resposta que funcione no Linux (GIT 1.7.1):
Mudei um pouco a ordem dos comandos, mas isso não parece ter nenhum impacto. A chave é a presença da barra final "/" no final do caminho na etapa 5.
fonte
Infelizmente, nenhuma das opções acima funcionou para mim, então passei muito tempo tentando diferentes combinações de
sparse-checkout
arquivos.No meu caso, eu queria pular pastas com as configurações do IntelliJ IDEA.
Aqui está o que eu fiz:
Corre
git clone https://github.com/myaccount/myrepo.git --no-checkout
Corre
git config core.sparsecheckout true
Criado
.git\info\sparse-checkout
com o seguinte conteúdoExecute 'git checkout -' para obter todos os arquivos.
O ponto crítico para fazê-lo funcionar foi adicionar
/*
o nome da pasta.Tenho git 1.9
fonte
Sim, é possível baixar uma pasta em vez de baixar o repositório inteiro. Mesmo any / last commit
Ótima maneira de fazer isso
-r HEAD baixará apenas a última revisão, ignorará todo o histórico.
Observe o tronco e / pasta específica
Copie e altere o URL antes e depois
/trunk/
. Espero que isso ajude alguém. Aproveitar :)Actualizado em 26 de setembro de 2019
fonte
Resposta atualizada 2020:
Agora existe um comando
git sparse-checkout
que apresento em detalhes com o Git 2.25 (primeiro trimestre de 2020)A resposta de nicono ilustra seu uso:
Ele evoluiu com o Git 2.27 e sabe como "reaplicar" um checkout esparso, como aqui .
Observe que, com o Git 2.28,
git status
você menciona que você está em um repositório com check-out esparsoResposta original: 2016
O git 2.9 (junho de 2016) generalizará a
--no-checkout
opção paragit worktree add
(o comando que permite trabalhar com várias árvores de trabalho para um repositório )Consulte commit ef2a0ac (29 de março de 2016) por Ray Zhang (
OneRaynyDay
) .Ajudado por: Eric Sunshine (
sunshineco
) e Junio C Hamano (gitster
) .(Mesclado por Junio C Hamano -
gitster
- na confirmação 0d8683c , 13 de abril de 2016)A
git worktree
página de manual agora inclui:fonte
Etapas para poupar apenas a pasta específica:
fonte
Com base nesta resposta de apenwarr e este comentário de Miral, eu vim com a seguinte solução, que me salvou quase 94% de espaço em disco ao clonar o repositório linux git localmente, enquanto desejava apenas um subdiretório de documentação:
Então, diminuí de 2,9 GB para 182 MB, o que já é muito bom.
Embora eu não tenha conseguido fazer isso funcionar
git clone --depth 1 --no-checkout --filter=blob:none file:///…/linux linux-sparse-test
( sugerido aqui ), os arquivos ausentes foram adicionados como arquivos removidos ao índice. Portanto, se alguém souber o equivalente degit clone --filter=blob:none
forgit fetch
, provavelmente podemos economizar mais megabytes. (A leitura da página de manualgit-rev-list
também sugere que há algo parecido--filter=sparse:path=…
, mas também não consegui que isso funcionasse.(Todos tentaram com o git 2.20.1 do Debian Buster.)
fonte
--filter=sparse:path=…
.Eu sou novo no git, mas parece que se eu fizer o git checkout para cada diretório, ele funcionará. Além disso, o arquivo de verificação esparsa precisa ter uma barra após cada diretório, conforme indicado. Alguém com mais experiência confirma que isso funcionará.
Curiosamente, se você fizer check-out de um diretório que não está no arquivo de check-out esparso, isso parece não fazer diferença. Eles não aparecem no status git e o git read-tree -m -u HEAD não faz com que seja removido. O git reset --hard também não remove o diretório. Alguém mais experiente se preocupa em comentar o que o git pensa em diretórios com check-out, mas que não estão no arquivo de check-out esparso?
fonte
No git 2.27, parece que o checkout esparso do git evoluiu. A solução nesta resposta não funciona exatamente da mesma maneira (em comparação com o git 2.25)
Esses comandos funcionaram melhor:
Veja também: git-clone --sparse e git-sparse-checkout add
fonte
No meu caso, quero pular a
Pods
pasta ao clonar o projeto. Eu fiz passo a passo como abaixo e funciona para mim. Espero que ajude.Lembrete: se você quiser pular mais pastas, basta adicionar mais linha no arquivo de verificação esparsa.
fonte