Eu tenho um projeto com o git e só quero clonar ou extrair um diretório específico, como myproject / javascript, assim como o subversion.
faça algumas alterações, confirme e empurre novamente.
É possível?
Onde " path/..." em (3) começa no diretório logo abaixo da raiz do repositório que contém o seu " .../file"
Observe que, em vez de "HEAD", o código de hash de uma confirmação específica pode ser usado e, em seguida, você obterá a revisão (arquivo) ou a revisão (dir) específica dessa confirmação.
Só percebi que não entendi a pergunta. Em vez disso, minha resposta aborda como fazer check-out de um único arquivo, que pode ser modificado e confirmado.
vergueishon
Você abordou o título da pergunta, que é bom o suficiente. Isso acabou de me salvar. Para mim, essa é a resposta correta - principalmente porque esse foi o principal sucesso do Google para esse problema.
Morgon
21
Isso ainda recebe todo o repo. Para um projeto de 2GB de tamanho, isso não faz economizar muito tempo ..
Pithikos
5
Para aqueles que leem esses comentários e não sabem como isso não responde à pergunta, o que essa solução faz é fornecer uma cópia apenas dessa pasta, mas não é uma cópia de trabalho, o que significa que você não pode modificar e re -commit. Então, como o @Morgon disse, ele aborda o título da pergunta (você PODE puxar apenas um diretório), mas não responde o corpo da pergunta ("faça algumas alterações, confirme e empurre novamente").
msb
@StanHolodnak --não é necessário. Ele força os bits após serem interpretados como um caminho. Portanto, sim, se você tiver um arquivo com o nome --helpque deseja efetuar o checkout, será necessário git checkout HEAD -- --help
Isso funciona se você só quer usar a versão remota de um arquivo para substituir arquivo local, eu acho
John
isso puxa a pasta também, como não descarregar a pasta, mas apenas coisas dentro da pasta?
Al Kasih
Não há necessidade fetchou checkoutcomando; podemos simplesmente fazer a solicitação pull após o remote addcomando para obter todo o ramo mestre.
Iqra.
2
Como o Pithkos aponta na resposta aceita, essa resposta também fará o download do repositório remoto TODO na sua máquina local. A resposta da shingara é a mais clara - não há como remotamente retirar uma parte de um repositório. No entanto, para aqueles que não se importam com a largura de banda da busca INTEIRA e estão interessados em fazer uma cópia de trabalho de uma parte do cache local, a resposta aceita mostra como. Mas eu só quero deixar claro que todo o histórico do repositório (em um formato compactado) deve ser baixado em sua máquina.
Gabe Halsmer
39
Depois de muito procurar uma resposta, sem encontrar, desistir, tentar de novo e assim por diante, finalmente encontrei uma solução para isso em outro tópico do SO:
Estou postando aqui principalmente porque sempre que tento pesquisar no Google como fazer isso, esse é um resultado excelente, e esse segmento nem chega perto de ser exibido. :( Eu me sinto mal copiar-colar, mas eu acho que é SO melhores práticas?
MSB
1
Esta é a única solução limpa. Tentei as respostas acima. Depois de verificar minha ramificação com as outras respostas, não consegui extrair e tive vários novos arquivos que precisavam ser confirmados. Com esta solução, tudo parece certo. Mas NOTA: Independentemente do ramo que foi retirado, git vai pensar que você está em master. Apenas certifique-se que você faz git branch --set-upstream-to=origin/<branch>para puxar corretamente
seebiscuit
12
Não é possível. Você precisa puxar todo o repositório ou nada.
Mesmo que você precise buscar tudo, seria interessante um puxão em uma árvore de trabalho de caixa esparsa? Veja stackoverflow.com/questions/2416815/…
VonC
10
Só para adicionar isso, a razão pela qual você não pode extrair apenas um diretório é porque o git usa o rastreamento semântico de dados, não o rastreamento semântico de arquivos, para que você possa mover o código (ou outros dados) para dentro e para fora dos arquivos sem precisar informar a fonte sistema de rastreamento (até que você atualize, é claro.) Por causa disso, o código também pode entrar e sair dos diretórios sem problemas, portanto, pegar apenas um diretório não faz tanto sentido. Espero que isto ajude.
OmnipotentEntity
12
@OmnipotentEntity Desculpe, mas IMHO faz sentido. A implementação não deve limitar o uso. O Git sabe o que são diretórios (pelo menos ao criar uma cópia de trabalho local), portanto não há razão para que ele não possa executar alguma operação semelhante no servidor e apenas enviar a saída relevante. Concedido, isso não está implementado atualmente, mas isso se deve à falta de um recurso, não a uma impossibilidade fundamental. Pessoalmente, acho que é um recurso muito importante, mas ei, essa é uma das razões pelas quais evito o git quando possível.
Isso faz o download de um diretório específico de arquivo para fins de arquivamento; isso não extrai uma cópia que você pode modificar e empurrar para trás.
LeetNightshade
Muito legal. Provavelmente, não é aceitável como solução para o OP, mas na verdade era o que eu procurava, pois só preciso pesquisar o conteúdo de uma pasta grande em um repositório ainda maior que definitivamente não quero buscar e não preciso modificar / empurrar.
Oliver
7
Se você deseja obter as alterações mais recentes em um diretório sem inseri-lo, é possível:
Às vezes, você só quer dar uma olhada nas cópias anteriores dos arquivos sem a dificuldade de passar pelas diferenças.
Nesse caso, é igualmente fácil criar um clone de um repositório e verificar o commit específico no qual você está interessado e dar uma olhada no subdiretório nesse repositório clonado. Como tudo é local, você pode excluir este clone quando terminar.
Por toda essa luta com caminhos de arquivos teóricos e exemplos como eu, aqui está um exemplo do mundo real: a Microsoft oferece seus documentos e exemplos no git hub, infelizmente eles reúnem todos os seus arquivos de exemplo para uma grande quantidade de tópicos neste repositório:
Respostas:
git fetch
git checkout HEAD path/to/your/dir/or/file
Onde "
path/...
" em (3) começa no diretório logo abaixo da raiz do repositório que contém o seu ".../file
"Observe que, em vez de "HEAD", o código de hash de uma confirmação específica pode ser usado e, em seguida, você obterá a revisão (arquivo) ou a revisão (dir) específica dessa confirmação.
fonte
--
não é necessário. Ele força os bits após serem interpretados como um caminho. Portanto, sim, se você tiver um arquivo com o nome--help
que deseja efetuar o checkout, será necessáriogit checkout HEAD -- --help
Em um diretório vazio:
fonte
fetch
oucheckout
comando; podemos simplesmente fazer a solicitação pull após oremote add
comando para obter todo o ramo mestre.Depois de muito procurar uma resposta, sem encontrar, desistir, tentar de novo e assim por diante, finalmente encontrei uma solução para isso em outro tópico do SO:
Como git-pull, exceto uma pasta
Para copiar e colar o que está lá:
Para fazer o que o OP deseja (trabalhe em apenas um diretório), basta adicionar esse diretório ao
.git/info/sparse-checkout
executar as etapas acima.Muito obrigado a @cforbish!
fonte
master
. Apenas certifique-se que você fazgit branch --set-upstream-to=origin/<branch>
para puxar corretamenteNão é possível. Você precisa puxar todo o repositório ou nada.
fonte
Talvez este comando possa ser útil:
"Et voilà"
fonte
Se você deseja obter as alterações mais recentes em um diretório sem inseri-lo, é possível:
fonte
git clone --filter
do Git 2.19Essa opção realmente ignora a busca de objetos desnecessários do servidor.
Escrevi uma resposta detalhada explicando o status atual do suporte em: Como clonar um subdiretório apenas de um repositório Git?
É muito provável que tudo o que for implementado
git clone
nessa área também tenhagit pull
análogos.fonte
Tentei e testei isso funciona!
Espero que isso tenha sido útil!
fonte
Às vezes, você só quer dar uma olhada nas cópias anteriores dos arquivos sem a dificuldade de passar pelas diferenças.
Nesse caso, é igualmente fácil criar um clone de um repositório e verificar o commit específico no qual você está interessado e dar uma olhada no subdiretório nesse repositório clonado. Como tudo é local, você pode excluir este clone quando terminar.
fonte
Por toda essa luta com caminhos de arquivos teóricos e exemplos como eu, aqui está um exemplo do mundo real: a Microsoft oferece seus documentos e exemplos no git hub, infelizmente eles reúnem todos os seus arquivos de exemplo para uma grande quantidade de tópicos neste repositório:
Eu só estava interessado nos arquivos js do Microsoft Dynamics no caminho
então eu fiz o seguinte
Crie um
arquivo na minha pasta de repositórios no disco
nesse diretório usando o cmd no windows
O conteúdo do arquivo
é
finalmente faça um
fonte