Encontrei uma coleção de slackbuilds, alguns que preciso que estejam no GitHub. https://github.com/PhantomX/slackbuilds/ Não quero obter todo o git.
git clone https://github.com/PhantomX/slackbuilds.git
Mas apenas obtenha um slackbuild, para este aqui .
Como fazer isso? É possível?
Comentários
- stackoverflow.com/a/13738951/2072269
Resposta
Você vai acabar baixando o histórico inteiro, então não vejo muito benefício nisso, mas você pode fazer check-out de peças específicas usando um check-out “esparso”. Citando esta postagem do Stack Overflow :
As etapas para fazer um esparso clone são os seguintes:
mkdir <repo> cd <repo> git init git remote add -f origin <url>
Isso cria um repositório vazio com seu controle remoto e busca todos os objetos, mas não os verifica. fazer:
git config core.sparseCheckout true
Agora você precisa definir quais arquivos / pastas deseja realmente verificar. Isso é feito listando-os em
.git/info/sparse-checkout
, por exemplo:echo "some/dir/" >> .git/info/sparse-checkout echo "another/sub/tree" >> .git/info/sparse-checkout
Por último, mas não menos importante, atualize seu repositório vazio com o estado do remoto:
git pull origin master
Você pode querer dar uma olhada no tutorial estendido e você provavelmente deve ler a documentação oficial para checkout esparso .
Talvez seja melhor usar um clone raso também. Em vez do git pull
comando fornecido anteriormente, tente:
git pull --depth=1 origin master
Comentários
- Estou recebendo
error: Sparse checkout leaves no entry on working directory
depois de fazer um git pull depois de fazer a modificação emcore.sparseCheckout
e.git/info/sparse-checkout
- Correção:
git init; git remote ...
apenas configure as coisas, nada é baixado. O ponto principal de esparso é obter apenas os objetos nos quais você está interessado. - @vonbrand que ‘ é o que
-f
option é para: ” Com a opção -f, git fetch < name > é executado imediatamente após as informações remotas serem configuradas. ” - Após
git remote add -f origin <url>
git ainda está baixando todo o repositório . No meu caso, não ‘ não quero perder tempo esperando por isso, mesmo que não ‘ verifique todo o repo. - Na verificação esparsa, definimos o que queremos verificar, mas há uma maneira de excluir alguns diretórios e verificar o resto?
Resposta
git clone --filter
do git 2.19 agora funciona no GitHub (testado em 2020-09 -18, git 2.25.1)
Esta opção foi adicionada junto com uma atualização do protocolo remoto e realmente impede que os objetos sejam baixados do servidor.
Por exemplo, para clonar apenas os objetos necessários para d1
deste repositório: https://github.com/cirosantilli/test-git-partial-clone Eu posso fazer:
git clone \ --depth 1 \ --filter=blob:none \ --no-checkout \ https://github.com/cirosantilli/test-git-partial-clone \ ; cd test-git-partial-clone git checkout master -- d1
O comando clone obtém apenas:
- um único objeto de confirmação com a ponta do
master
branch - todos os 4 objetos de árvore do repositório:
- diretório de nível superior de confirmação
- os três diretórios
d1
,d2
,master
Então, o comando checkout
busca apenas os blobs (arquivos) ausentes do servidor:
-
d1/a
-
d1/b
Melhor ainda, mais tarde o GitHub provavelmente começará a oferecer suporte:
--filter=blob:none \ --filter=tree:0 \
onde --filter=tree:0
do Git 2.20 impedirá o clone
busca desnecessária de todos os objetos da árvore e permite que seja adiada para checkout
. Mas em meu teste de 2020-09-18 que falha com:
fatal: invalid filter-spec "combine:blob:none+tree:0"
presumivelmente porque o --filter=combine:
filtro composto ( adicionado no Git 2.24, implícito por vários --filter
) ainda não foi implementado.
Observe quais objetos foram buscados com:
git verify-pack -v .git/objects/pack/*.pack
conforme mencionado em: https://stackoverflow.com/questions/7348698/git-how-to-list-all-objects-in-the-database/18793029#18793029 Não me dá uma indicação superclara do que cada objeto é exatamente, mas diz o tipo de cada objeto (commit
, tree
, blob
), e uma vez que há tão poucos objetos nesse repositório mínimo, posso deduzir sem ambigüidade o que cada objeto é.
git rev-list --objects --all
produziu uma saída mais clara com caminhos para árvore / blobs, mas infelizmente busca alguns objetos quando o executo, o que torna difícil determinar o que foi obtido quando, me avise se alguém tiver um comando melhor.
TODO encontre o anúncio do GitHub que diz quando eles começaram a suportá-lo. https://github.blog/2020-01-17-bring-your-monorepo-down-to-size-with-sparse-checkout/ de 2020-01-17 já menciona --filter blob:none
.
git sparse-checkout
I acho que este comando se destina a gerenciar um arquivo de configurações que diz ” Eu só me importo com essas subárvores ” para que comandos futuros afetem apenas aqueles subárvores. Mas é um pouco difícil ter certeza porque a documentação atual é um pouco … esparsa 😉
Ela não impede, por si só, a obtenção de blobs.
Se este entendimento estiver correto, então este seria um bom complemento para git clone --filter
descrito acima, pois evitaria a busca não intencional de mais objetos se você pretende fazer operações git no repositório clonado parcial .
Quando experimentei o Git 2.25.1:
git clone \ --depth 1 \ --filter=blob:none \ --no-checkout \ https://github.com/cirosantilli/test-git-partial-clone \ ; cd test-git-partial-clone git sparse-checkout init
não funcionou porque o init
realmente buscava todos os objetos.
No entanto, no Git 2.28, ele não buscava os objetos como desejado. Mas então se eu fizer:
git sparse-checkout set d1
d1
não é buscado e verificado, embora isso diga explicitamente deve: https://github.blog/2020-01-17-bring-your-monorepo-down-to-size-with-sparse-checkout/ # sparse-checkout-and-partial-clones Com isenção de responsabilidade:
Fique atento para que o recurso de clone parcial se torne amplamente disponível [1].
[1]: O GitHub ainda está avaliando esse recurso internamente enquanto está ativado em alguns repositórios selecionados (incluindo o exemplo usado nesta postagem). Conforme o recurso se estabiliza e amadurece, nós o manteremos atualizado com seu progresso.
Então, sim, é muito difícil ter certeza no momento, em parte graças à alegria de GitHub ser um código-fonte fechado. Mas vamos ficar de olho nisso.
Quebra de comando
O servidor deve ser configurado com:
git config --local uploadpack.allowfilter 1 git config --local uploadpack.allowanysha1inwant 1
Divisão do comando:
-
--filter=blob:none
pula todos os blobs, mas ainda busca todos os objetos de árvore -
--filter=tree:0
pula as árvores desnecessárias: https://www.spinics.net/lists/git/msg342006.html -
--depth 1
já implica--single-branch
, veja também: https://stackoverflow.com/questions/1778088/how-to-clone-a-single-branch-in-git -
file://$(path)
é necessário para superar asgit clone
travessuras do protocolo: https://stackoverflow.com/questions/47307578/how-to-shallow-clone-a-local-git-repository-with-a-relative-path -
--filter=combine:FILTER1+FILTER2
é a sintaxe para usar vários filtros em uma vez, tentar passar--filter
por algum motivo falha com: ” várias especificações de filtro não podem ser combinadas “. Isso foi adicionado no Git 2.24 em e987df5fe62b8b29be4cdcdeb3704681ada2b29e ” list-objects-filter: implementar filtros compostos ”Editar: no Git 2.28, vejo experimentalmente que
--filter=FILTER1 --filter FILTER2
também tem o mesmo efeito, já que o GitHub não implementacombine:
ainda em 2020-09- 18 e reclamafatal: invalid filter-spec "combine:blob:none+tree:0"
. TODO introduzido em qual versão?
O formato de --filter
está documentado em man git-rev-list
.
Docs na árvore Git:
- https://github.com/git/git/blob/v2.19.0/Documentation/technical/partial-clone.txt
- https://github.com/git/git/blob/v2.19.0/Documentation/rev-list-options.txt#L720
- https://github.com/git/git/blob/v2.19.0/t/t5616-partial-clone.sh
Teste-o localmente
O script a seguir gera reproduzivelmente o https://github.com/cirosantilli/test-git-partial-clone repositório localmente, faz um clone local e observa o que foi clonado:
#!/usr/bin/env bash set -eu list-objects() ( git rev-list --all --objects echo "master commit SHA: $(git log -1 --format="%H")" echo "mybranch commit SHA: $(git log -1 --format="%H")" git ls-tree master git ls-tree mybranch | grep mybranch git ls-tree master~ | grep root ) # Reproducibility. export GIT_COMMITTER_NAME="a" export GIT_COMMITTER_EMAIL="a" export GIT_AUTHOR_NAME="a" export GIT_AUTHOR_EMAIL="a" export GIT_COMMITTER_DATE="2000-01-01T00:00:00+0000" export GIT_AUTHOR_DATE="2000-01-01T00:00:00+0000" rm -rf server_repo local_repo mkdir server_repo cd server_repo # Create repo. git init --quiet git config --local uploadpack.allowfilter 1 git config --local uploadpack.allowanysha1inwant 1 # First commit. # Directories present in all branches. mkdir d1 d2 printf "d1/a" > ./d1/a printf "d1/b" > ./d1/b printf "d2/a" > ./d2/a printf "d2/b" > ./d2/b # Present only in root. mkdir "root" printf "root" > ./root/root git add . git commit -m "root" --quiet # Second commit only on master. git rm --quiet -r ./root mkdir "master" printf "master" > ./master/master git add . git commit -m "master commit" --quiet # Second commit only on mybranch. git checkout -b mybranch --quiet master~ git rm --quiet -r ./root mkdir "mybranch" printf "mybranch" > ./mybranch/mybranch git add . git commit -m "mybranch commit" --quiet echo "# List and identify all objects" list-objects echo # Restore master. git checkout --quiet master cd .. # Clone. Don"t checkout for now, only .git/ dir. git clone --depth 1 --quiet --no-checkout --filter=blob:none "file://$(pwd)/server_repo" local_repo cd local_repo # List missing objects from master. echo "# Missing objects after --no-checkout" git rev-list --all --quiet --objects --missing=print echo echo "# Git checkout fails without internet" mv ../server_repo ../server_repo.off ! git checkout master echo echo "# Git checkout fetches the missing directory from internet" mv ../server_repo.off ../server_repo git checkout master -- d1/ echo echo "# Missing objects after checking out d1" git rev-list --all --quiet --objects --missing=print
Saída no Git v2.19.0:
# List and identify all objects c6fcdfaf2b1462f809aecdad83a186eeec00f9c1 fc5e97944480982cfc180a6d6634699921ee63ec 7251a83be9a03161acde7b71a8fda9be19f47128 62d67bce3c672fe2b9065f372726a11e57bade7e b64bf435a3e54c5208a1b70b7bcb0fc627463a75 d1 308150e8fddde043f3dbbb8573abb6af1df96e63 d1/a f70a17f51b7b30fec48a32e4f19ac15e261fd1a4 d1/b 84de03c312dc741d0f2a66df7b2f168d823e122a d2 0975df9b39e23c15f63db194df7f45c76528bccb d2/a 41484c13520fcbb6e7243a26fdb1fc9405c08520 d2/b 7d5230379e4652f1b1da7ed1e78e0b8253e03ba3 master 8b25206ff90e9432f6f1a8600f87a7bd695a24af master/master ef29f15c9a7c5417944cc09711b6a9ee51b01d89 19f7a4ca4a038aff89d803f017f76d2b66063043 mybranch 1b671b190e293aa091239b8b5e8c149411d00523 mybranch/mybranch c3760bb1a0ece87cdbaf9a563c77a45e30a4e30e a0234da53ec608b54813b4271fbf00ba5318b99f root 93ca1422a8da0a9effc465eccbcb17e23015542d root/root master commit SHA: fc5e97944480982cfc180a6d6634699921ee63ec mybranch commit SHA: fc5e97944480982cfc180a6d6634699921ee63ec 040000 tree b64bf435a3e54c5208a1b70b7bcb0fc627463a75 d1 040000 tree 84de03c312dc741d0f2a66df7b2f168d823e122a d2 040000 tree 7d5230379e4652f1b1da7ed1e78e0b8253e03ba3 master 040000 tree 19f7a4ca4a038aff89d803f017f76d2b66063043 mybranch 040000 tree a0234da53ec608b54813b4271fbf00ba5318b99f root # Missing objects after --no-checkout ?f70a17f51b7b30fec48a32e4f19ac15e261fd1a4 ?8b25206ff90e9432f6f1a8600f87a7bd695a24af ?41484c13520fcbb6e7243a26fdb1fc9405c08520 ?0975df9b39e23c15f63db194df7f45c76528bccb ?308150e8fddde043f3dbbb8573abb6af1df96e63 # Git checkout fails without internet fatal: "/home/ciro/bak/git/test-git-web-interface/other-test-repos/partial-clone.tmp/server_repo" does not appear to be a git repository fatal: Could not read from remote repository. Please make sure you have the correct access rights and the repository exists. # Git checkout fetches the missing directory from internet remote: Enumerating objects: 1, done. remote: Counting objects: 100% (1/1), done. remote: Total 1 (delta 0), reused 0 (delta 0) Receiving objects: 100% (1/1), 45 bytes | 45.00 KiB/s, done. remote: Enumerating objects: 1, done. remote: Counting objects: 100% (1/1), done. remote: Total 1 (delta 0), reused 0 (delta 0) Receiving objects: 100% (1/1), 45 bytes | 45.00 KiB/s, done. # Missing objects after checking out d1 ?8b25206ff90e9432f6f1a8600f87a7bd695a24af ?41484c13520fcbb6e7243a26fdb1fc9405c08520 ?0975df9b39e23c15f63db194df7f45c76528bccb
Conclusões: todos os blobs de fora de d1/
estão faltando. Por exemplo.0975df9b39e23c15f63db194df7f45c76528bccb
, que d2/b
não está lá depois de verificar d1/a
.
Observe que root/root
e mybranch/mybranch
também estão ausentes, mas --depth 1
esconde isso de a lista de arquivos ausentes. Se você remover --depth 1
, eles serão exibidos na lista de arquivos ausentes.
Eu tenho um sonho
Este recurso pode revolucionar o Git.
Imagine ter toda a base de código de sua empresa em um único repo sem ferramentas feias de terceiros como repo
.
Imagine armazenando blobs enormes diretamente no repo sem nenhuma extensão feia de terceiros .
Imagine se o GitHub permitisse por metadados de arquivo / diretório como estrelas e permissões, para que você possa armazenar todas as suas coisas pessoais em um único repositório.
Imagine se os submódulos eram tratados exatamente como diretórios regulares : basta solicitar um SHA de árvore e um mecanismo semelhante ao DNS resolve sua solicitação , primeiro procurando em seu local ~/.git
e, em seguida, primeiro para servidores mais próximos (espelho / cache da sua empresa) e terminando no GitHub.
Resposta
Tente isto:
svn export https://github.com/PhantomX/slackbuilds/trunk/${directory}
Comentários
- Isto é a maneira mais simples. Ele não baixa todo o repo. Observe que devemos adicionar
/trunk
e remover/tree/master
. Mais aqui - Obrigado! Só quero clonar uma pasta do repo e não todas as pastas de um repo. E este realmente funciona para mim.
Resposta
solução de trabalho:
você precisa desligar a compressão:
git config --global core.compression 0
então você precisa usar clone raso
git clone --depth=1 <url>
então o passo mais importante é fazer cd em seu projeto clonado
cd <shallow cloned project dir>
agora abra o clone, passo a passo
git fetch --depth=N, with increasing N
por exemplo,
git fetch --depth=4
então,
git fetch --depth=100
então,
git fetch --depth=500
você pode escolher quantas etapas deseja substituindo este N,
e, finalmente, baixar todas as revisões restantes usando,
git fetch --unshallow
voto positivo se isso ajudar você 🙂
Resposta
Finalmente consegui fazer isso graças ao acima. Eu estava editando o arquivo diretamente, obtendo erros ao incluir acidentalmente as aspas. Seu arquivo .git / info / sparse-checkout deve incluir apenas o diretório, sem aspas. Aqui está um exemplo: Este projeto gigantesco: https://github.com/SharePoint/sp-dev-fx-webparts , eu queria apenas o editor de script react no diretório de amostras. https://github.com/SharePoint/sp-dev-fx-webparts / tree / master / samples / react-script-editor
Eu segui as instruções acima e fiz funcionar quando meu arquivo .git / info / sparse-checkout tinha exatamente isso nele
samples / react-script-editor
Resposta
Isso clonará uma pasta específica e removerá todo o histórico não relacionado a ela.
git clone --single-branch -b {branch} [email protected]:{user}/{repo}.git git filter-branch --subdirectory-filter {path/to/folder} HEAD git remote remove origin git remote add origin [email protected]:{user}/{new-repo}.git git push -u origin master
Comentários
- Isso ainda clonará todo o histórico (
--depth=1
para evitar) e todos os outros diretórios (???
para evitar?).
Resposta
Para repositórios GitHub, você pode clonar qualquer sub -diretórios de qualquer repositório GitHub (em qualquer referência) usando https://github.com/HR/github-clone
Comentários
- Infelizmente, isso não é adequado para cenários Dockerfile, já que arrastaria todo o Python como uma dependência apenas para usá-lo uma vez durante a construção da imagem.
Resposta
Responderei com as restrições específicas que enfrentei.
- No VSO, SSH foi desabilitado pela segurança, então não podia “usar o arquivo git. Apenas PAT / CredentialProvider era suportado.
- Nosso branch tinha um código enorme, então clone git levaria 15 minutos, no mínimo.
Aqui está o que eu fiz:
- Processo manual único: na IU do VSO, crie um novo o ramo remoto diz “emptyBranch” que não possui arquivos (todos foram deletados).
-
git clone --depth=1 --single-branch --branch emptyBranch <remote>
(muito rápido) -
git checkout <branchToSyncTo> <directoryToSyncTo>
(faz check-out apenas de pastas específicas)