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

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 em core.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:

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:

O formato de --filter está documentado em man git-rev-list.

Docs na árvore Git:

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 

GitHub upstream .

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:

  1. Processo manual único: na IU do VSO, crie um novo o ramo remoto diz “emptyBranch” que não possui arquivos (todos foram deletados).
  2. git clone --depth=1 --single-branch --branch emptyBranch <remote> (muito rápido)
  3. git checkout <branchToSyncTo> <directoryToSyncTo> (faz check-out apenas de pastas específicas)

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *