Eu tenho meu repositório Git que, na raiz, possui dois subdiretórios:
/finisht
/static
Quando isso estava no SVN , o /finisht
check-out era feito em um local e o /static
check-out em outro lugar, da seguinte forma:
svn co svn+ssh://[email protected]/home/admin/repos/finisht/static static
Existe uma maneira de fazer isso com o Git?
git
repository
subdirectory
git-clone
sparse-checkout
Nick Sergeant
fonte
fonte
git clone
comando mais simples? Eu usei essa resposta simples . Se há algo mais simples, por favor comentárioRespostas:
EDIT : A partir do Git 2.19, isso é finalmente possível, como pode ser visto nesta resposta .
Considere votar essa resposta.
Nota: no Git 2.19, apenas o suporte do lado do cliente é implementado, o suporte do lado do servidor ainda está ausente e, portanto, funciona apenas ao clonar repositórios locais. Observe também que grandes hosts do Git, por exemplo, o GitHub, na verdade não usam o servidor Git, eles usam sua própria implementação; portanto, mesmo que o suporte apareça no servidor Git, isso não significa automaticamente que ele funcione nos hosts do Git. (OTOH, como eles não usam o servidor Git, eles poderiam implementá-lo mais rapidamente em suas próprias implementações antes de aparecer no servidor Git.)
Não, isso não é possível no Git.
A implementação de algo assim no Git seria um esforço substancial e significaria que a integridade do repositório do lado do cliente não poderia mais ser garantida. Se você estiver interessado, procure discussões sobre "sparse clone" e "sparse fetch" na lista de discussão do git.
Em geral, o consenso na comunidade Git é que, se você tiver vários diretórios sempre com check-out independente, esses são realmente dois projetos diferentes e devem residir em dois repositórios diferentes. Você pode colá-los novamente usando os Submodules Git .
fonte
git-read-tree
, o que é muito tempo depoisget-fetch
. A questão não era verificar apenas um subdiretório, mas clonar apenas um subdiretório. Não vejo como caixas esparsas poderiam fazer isso, uma vez quegit-read-tree
é executado após o clone já ter sido concluído.O que você está tentando fazer é chamado de verificação esparsa , e esse recurso foi adicionado no git 1.7.0 (fevereiro de 2012). As etapas para executar um clone esparso são as seguintes:
Isso cria um repositório vazio com seu controle remoto e busca todos os objetos, mas não os verifica. Então faça:
Agora você precisa definir quais arquivos / pastas você deseja realmente fazer check-out. Isso é feito listando-os em
.git/info/sparse-checkout
, por exemplo:Por último, mas não menos importante, atualize seu repositório vazio com o estado do controle remoto:
Agora você terá os arquivos "retirados" para
some/dir
eanother/sub/tree
no seu sistema de arquivos (com esses caminhos ainda) e nenhum outro caminho presente.Você pode querer dar uma olhada no tutorial estendido e provavelmente deve ler a documentação oficial para uma verificação esparsa .
Como uma função:
Uso:
Observe que isso ainda fará o download de todo o repositório do servidor - apenas o tamanho da finalização da compra. No momento, não é possível clonar apenas um único diretório. Mas se você não precisar do histórico do repositório, poderá pelo menos economizar largura de banda criando um clone superficial. Veja a resposta de udondan abaixo para obter informações sobre como combinar clone superficial e caixa esparsa.
A partir do git 2.25.0 (janeiro de 2020), um comando experimental de verificação esparsa é adicionado ao git:
fonte
https://github.com/Umkus/nginx-boilerplate/tree/master/src
right into/etc/nginx
git remote add
comando não implica uma busca, masgit remote add -f
, como usado aqui, sim! É isso que-f
significa.--depth=1
eu clonei o Chromium Devtools em 338 MB em vez de 4,9 GB de histórico completo da fonte + do Blink. Excelente.git clone --filter
do Git 2.19Essa opção realmente ignora a busca de objetos desnecessários do servidor. Também incluindo o
--filter=tree:0
Git 2.20 e o--filter=combine
filtro composto adicionado no Git 2.24, terminamos com:O servidor deve ser configurado com:
Foi feita uma extensão ao protocolo remoto Git para oferecer suporte a esse recurso
v2.19.0
e, na verdade, pular a busca de objetos desnecessários, mas não há suporte para o servidor no momento. Mas já pode ser testado localmente.Divisão de comando:
--filter=blob:none
pula todos os blobs, mas ainda busca todos os objetos da á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: Como clonar uma única ramificação no Git?file://$(path)
é necessário para superar asgit clone
travessuras do protocolo: Como clonar superficialmente um repositório git local com um caminho relativo?--filter=combine:FILTER1+FILTER2
é a sintaxe para usar vários filtros ao mesmo tempo, tentando 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 "lista-objetos-filtro: implementar filtros compostos"O formato de
--filter
está documentado emman git-rev-list
.Documentos na árvore Git:
Teste
GitHub upstream .
Saída no Git v2.19.0:
Conclusões: todos os blobs de fora
d1/
estão ausentes. Por exemplo0975df9b39e23c15f63db194df7f45c76528bccb
, o qued2/b
não existe após o check-outd1/a
.Note-se que
root/root
emybranch/mybranch
também estão desaparecidos, mas--depth 1
esconde que a partir da lista de arquivos ausentes. Se você remover--depth 1
, eles serão exibidos na lista de arquivos ausentes.Eu tenho um sonho
Esse recurso pode revolucionar o Git.
Imagine ter toda a base de código da sua empresa em um único repositório, sem ferramentas feias de terceiros
repo
.Imagine armazenar enormes blobs diretamente no repositório, sem extensões feias de terceiros .
Imagine se o GitHub permitiria metadados por 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 foram tratados exatamente como diretórios regulares : basta solicitar um SHA em árvore e um mecanismo semelhante ao DNS resolve sua solicitação , primeiro procurando no local
~/.git
, depois nos servidores mais próximos (espelho / cache da empresa) e terminando no GitHub.fonte
fatal: invalid filter-spec 'combine:blob:none+tree:0'
Obrigado mesmo assim! Talvez ele funcione com versões mais recentes.Você pode combinar os recursos de caixa esparsa e clone superficial . O clone superficial corta o histórico e a verificação esparsa apenas puxa os arquivos correspondentes aos seus padrões.
Você precisará do mínimo git 1.9 para que isso funcione. Eu mesmo testei com 2.2.0 e 2.2.2.
Dessa forma, você ainda poderá pressionar , o que não é possível com
git archive
.fonte
git pull --depth=1 origin master
masgit pull --depth=1 origin <any-other-branch>
. isso é tão estranho, veja minha pergunta aqui: stackoverflow.com/questions/35820630/…Para outros usuários que desejam apenas baixar um arquivo / pasta do github, basta usar:
por exemplo
(sim, aqui está o svn. aparentemente em 2016 você ainda precisa do svn para fazer o download de alguns arquivos do github)
Cortesia: Faça o download de uma única pasta ou diretório de um repositório do GitHub
Importante - Atualize o URL do github e substitua
/tree/master/
por '/ trunk /'.Como script bash:
Nota Este método baixa uma pasta, não a clona / faz checkout. Você não pode enviar as alterações de volta ao repositório. Por outro lado, isso resulta em um download menor comparado ao checkout esparso ou raso.
fonte
https://github.com/tensorflow/tensorflow/tree/master/tensorflow/examples/trunk/udacity
mas obtive osvn: E170000: URL 'https://github.com/tensorflow/tensorflow/tree/master/tensorflow/examples/trunk/udacity' doesn't exist
erro :(Se você nunca planeja interagir com o repositório a partir do qual você clonou, poderá fazer um clone git completo e reescrever seu repositório usando git filter-branch --subdirectory-filter . Dessa forma, pelo menos a história será preservada.
fonte
git filter-branch --subdirectory-filter <subdirectory>
git clone https://github.com/your/repo_xx.git && cd repo_xx && git filter-branch --subdirectory-filter repo_xx_subdir
Isso parece muito mais simples:
fonte
svn export
em vezO Git 1.7.0 possui "verificações esparsas". Consulte “core.sparseCheckout” na página de manual do git config , “Sparse checkout” na página de manual da árvore de leitura do git e “Skip-worktree bit” na página de manual do git update-index .
A interface não é tão conveniente quanto os SVNs (por exemplo, não há como fazer uma verificação esparsa no momento de um clone inicial), mas a funcionalidade básica na qual interfaces mais simples podem ser construídas está agora disponível.
fonte
Não é possível clonar subdiretórios apenas com o Git, mas abaixo estão algumas soluções alternativas.
Filial do filtro
Você pode reescrever o repositório para ter a aparência de
trunk/public_html/
sua raiz do projeto e descartar todo o outro histórico (usandofilter-branch
), tente o ramo de check-out:Notas: O
--
que separa as opções de ramificação de filtro das opções de revisão e--all
para reescrever todas as ramificações e tags. Todas as informações, incluindo tempos de confirmação originais ou informações de mesclagem, serão preservadas . Esse comando honra o.git/info/grafts
arquivo e as referências norefs/replace/
espaço para nome; portanto, se você tiver enxertos ou substituiçõesrefs
definidos, a execução desse comando os tornará permanentes.Pouca compra
Aqui estão algumas etapas simples com abordagem de checkout esparso que preencherão o diretório de trabalho escassamente, para que você possa dizer ao Git quais pastas ou arquivos no diretório de trabalho valem a pena conferir.
Clone o repositório como de costume (
--no-checkout
é opcional):Você pode pular esta etapa, se o seu repositório já tiver clonado.
Dica: para repositórios grandes, considere o clone superficial (
--depth 1
) fazer checkout apenas da revisão mais recente ou--single-branch
apenas.Ativar
sparseCheckout
opção:Especifique a (s) pasta (s) para checkout esparso ( sem espaço no final):
ou editar
.git/info/sparse-checkout
.Faça o checkout da filial (por exemplo
master
):Agora você deve ter selecionado pastas no diretório atual.
Você pode considerar links simbólicos se tiver muitos níveis de diretórios ou ramo de filtragem.
fonte
pull
?filter-branch
reescreveria as confirmações pai, para que tivessem IDs SHA1 diferentes e, portanto, sua árvore filtrada não teria confirmações em comum com a árvore remota.git pull
não saberia de onde tentar se juntar.Acabei de escrever um script para o GitHub .
Uso:
fonte
Isso clonará uma pasta específica e removerá todo o histórico não relacionado a ela.
fonte
Aqui está um script de shell que escrevi para o caso de uso de um único check-out esparso de subdiretório
coSubDir.sh
fonte
ln -s ./.$localRepo/$subDir $localRepo
, em vez deln -s ./.$localRepo$subDir $localRepo
Eu escrevi um
.gitconfig
[alias]
para realizar um "checkout esparso". Confira (sem trocadilhos):No Windows, execute
cmd.exe
De outra forma:
Uso :
Os
git config
comandos são 'minificados' para conveniência e armazenamento, mas aqui está o alias expandido:fonte
L=${1##*/} L=${L%.git}
:? O espaço é um operador?Usando Linux? E só quer fácil acesso e limpeza da árvore de trabalho? sem incomodar o restante do código em sua máquina. tente links simbólicos !
Teste
fonte
Apenas para esclarecer algumas das ótimas respostas aqui, as etapas descritas em muitas das respostas assumem que você já possui um repositório remoto em algum lugar.
Dado: um repositório git existente, por exemplo
[email protected]:some-user/full-repo.git
, com um ou mais diretórios que você deseja extrair independentemente do restante do repositório, por exemplo , diretórios nomeadosapp1
eapp2
Supondo que você tenha um repositório git como o descrito acima ...
Então: você pode executar etapas como a seguir para extrair apenas diretórios específicos desse repositório maior:
Por engano, pensei que as opções de checkout esparso deviam ser definidas no repositório original: esse não é o caso. Você define quais diretórios deseja localmente, antes de extrair do controle remoto. Espero que este esclarecimento ajude outra pessoa.
fonte
Embora eu odeie ter que usar svn ao lidar com reposições git: / eu uso isso o tempo todo;
Isso permite que você copie do URL do github sem modificação. Uso;
fonte
Se você está realmente interessado nos arquivos de revisão mais recentes de um diretório, o Github permite fazer o download de um repositório como um arquivo Zip, que não contém histórico. Portanto, o download é muito mais rápido.
fonte
Então, eu tentei de tudo nesta etapa e nada funcionou para mim ... Acontece que na versão 2.24 do Git (a que acompanha o cpanel no momento desta resposta), você não precisa fazer isso
tudo o que você precisa é o nome da pasta
Então, em resumo, você faz isso
você edita o arquivo .git / info / sparse-checkout e adiciona os nomes das pastas (um por linha) com / * no final para obter subpastas e arquivos
Salve e execute o comando checkout
O resultado foi a pasta esperada do meu repo e nada mais Voto positivo se isso funcionou para você
fonte