Como faço o checkout de apenas um arquivo de um repositório git?
git
file
git-checkout
sparse-checkout
Arthur Ulfeldt
fonte
fonte
Respostas:
Originalmente, eu mencionei em 2012
git archive
(ver Jared Forsyth 's resposta e Robert Knight ' s resposta ), desde git1.7.9.5 (Março de 2012) , Paul Brannan 's resposta :Mas: em 2013, isso não era mais possível para URLs https://github.com remotos .
Veja a página antiga " Posso arquivar um repositório? "
A página atual (2018) " Sobre o arquivamento de conteúdo e dados no GitHub " recomenda o uso de serviços de terceiros como GHTorrent ou GH Archive .
Então você também pode lidar com cópias / clones locais:
Como alternativa, você pode fazer o seguinte se tiver uma cópia local do repositório vazio, conforme mencionado nesta resposta ,
Ou você deve clonar primeiro o repositório, o que significa que você obtém o histórico completo: - no repositório .git - na árvore de trabalho.
git config core.sparsecheckout true
).git/info/sparse-checkout
arquivoPara reler a árvore de trabalho:
Dessa forma, você acaba com uma árvore de trabalho, incluindo exatamente o que deseja (mesmo que seja apenas um arquivo)
Richard Gomes aponta ( nos comentários ) para " Como clonar, buscar ou poupar o checkout de um único diretório ou de uma lista de diretórios do repositório git? "
fonte
git archive
agora.Primeiro clone o repositório com a opção -n, que suprime o check-out padrão de todos os arquivos, e a opção --depth 1, o que significa que ele obtém apenas a revisão mais recente de cada arquivo
Em seguida, verifique apenas o arquivo que você deseja:
fonte
-n
a árvore de trabalho e o índice acabam sincronizados. Ou seja, todo o conteúdo aparece como excluído. Você tem quegit reset HEAD
ougit checkout HEAD file
. Também é realmente difícil trabalhar com o repositório neste momento, a menos que você realmente entenda como o git funciona.rm -rf .git
repositório ) adicionando outro ao script de NickMoore limparia todos os traços do repositório clonado e talvez atenuassem a preocupação de Jefromi em ter um repositório difícil de usar. Torna-me muito útil para várias aplicações, como o meu desafio atual de criar um gancho pós-recebimento para atualizar a versão de outro gancho pós-recebimento automaticamente.git
não é a melhor para esse tipo de trabalho). Esta resposta também é válida para esta pergunta , ou para outra popular , e muitas outras: mudename_of_file
paraname_of_folder
. Hoje em dia, o Git (subitem 2014) oferece sub - módulos para repo-owner, oferecendo alguns amigáveis para repo-users.Se você já possui uma cópia do repositório git, sempre pode fazer o checkout de uma versão de um arquivo usando a
git log
para descobrir o hash-id (por exemplo, 3cdc61015724f9965575ba954c8cd4232c8b42e4) e simplesmente digitar:Aqui está um exemplo real:
fonte
path-to-file
for um diretório, e o currentHEAD
contiver determinado arquivo, enquantotarget
não (ou vice-versa), isso não atualizará corretamente o arquivo. Existe uma maneira de lidar?Normalmente, não é possível baixar apenas um arquivo de
git
sem baixar o repositório inteiro, como sugerido na primeira resposta. É porque o Git não armazena arquivos como você pensa (como o CVS / SVN), mas os gera com base em todo o histórico do projeto.Mas existem algumas soluções alternativas para casos específicos. Os exemplos abaixo com marcadores de posição para
user
,project
,branch
,filename
.GitHub
GitLab
GitWeb
Se você estiver usando o Git no servidor - GitWeb , tente o exemplo (altere-o para o caminho certo):
GitWeb em drupalcode.org
Exemplo:
googlesource.com
Há um recurso não documentado que permite baixar versões codificadas em base64 de arquivos brutos:
Em outros casos, verifique se o seu repositório Git está usando alguma interface da web.
Se ele não está usando qualquer interface web, você pode considerar a empurrar o seu código para serviços externos, como GitHub , Bitbucket , etc . e use-o como um espelho.
Se você não tiver
wget
instalado, tentecurl -O (url)
alternativamente.fonte
wget
resposta brilhante e a simplicidade retorna, juntamente com a felicidade. Obrigado cara.git checkout branch_or_version - caminho / arquivo
exemplo:
git checkout HEAD -- main.c
fonte
Guia Mínimo
git checkout -- <filename>
Ref: https://git-scm.com/docs/git-checkout
Dup: Desfaz modificações na cópia de trabalho de um arquivo no Git?
fonte
git-checkout
.Agora nós podemos! Como este é o primeiro resultado no google, pensei em atualizar isso para a versão mais recente. Com o advento do git 1.7.9.5, temos o
git archive
comando que permitirá recuperar um único arquivo de um host remoto.Veja a resposta completa aqui https://stackoverflow.com/a/5324532/290784
fonte
github.com
HEAD
oumaster
nãoHEAD:directory
.git archive [email protected]:user/repo branch:path/to file | tar -x
Trabalhando no GIT 1.7.2.2
Por exemplo, você tem um some_remote remoto com ramificações branch1 , branch32
para fazer o checkout de um arquivo específico, você chama esses comandos:
como exemplo, será algo como isto
Este comando checkout copiará toda a estrutura do arquivo conf / en e conf / fr no diretório atual onde você chama esses comandos (é claro que eu assumo que você executou o git init em algum momento antes)
fonte
git fetch some_remote
antes, não é?Muito simples:
Isso não fará o checkout da
from-branch-name
filial. Você permanecerá em qualquer filial em que estiver, e somente esse arquivo único será retirado da ramificação especificada.Aqui está a parte relevante da página de manual para
git-checkout
Gorjeta de chapéu para Ariejan de Vroom, que me ensinou isso neste post do blog .
fonte
git clone --filter
do Git 2.19Esta opção realmente pula a busca da maioria dos objetos desnecessários do servidor:
O servidor deve ser configurado com:
Não há suporte para servidor a partir da v2.19.0, mas ele já pode ser testado localmente.
TODO:
--filter=blob:none
ignora todos os blobs, mas ainda busca todos os objetos da árvore. Mas em um repositório normal, isso deve ser pequeno comparado aos arquivos em si, portanto isso já é bom o suficiente. Perguntado em: https://www.spinics.net/lists/git/msg342006.html Os Devs responderam que um--filter=tree:0
está sendo trabalhado para fazer isso.Lembre-se que isso
--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?O formato de
--filter
está documentado emman git-rev-list
.Foi feita uma extensão ao protocolo remoto Git para suportar esse recurso.
Documentos na árvore Git:
Teste
GitHub upstream .
Saída no Git v2.19.0:
Conclusões: todos os blobs, exceto,
d1/a
estão ausentes. Por exemplof70a17f51b7b30fec48a32e4f19ac15e261fd1a4
, ou sejad1/b
, não existe após o check-outd1/
.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.fonte
Você pode fazer isso
fonte
Duas variantes do que já foi dado:
e:
Eles gravam o arquivo na saída padrão.
fonte
Digamos que o nome do arquivo seja 123.txt, isso funciona para mim:
Se o arquivo estiver dentro de um diretório A, certifique-se de especificá-lo corretamente:
fonte
No git, você não faz o 'checkout' dos arquivos antes de atualizá-los - parece que é isso que você procura.
Muitos sistemas, como clearcase, csv e outros, exigem que você faça o checkout de um arquivo antes de poder fazer alterações. O Git não exige isso. Você clona um repositório e faz alterações na sua cópia local do repositório.
Depois de atualizar os arquivos, você pode:
Para ver quais arquivos foram modificados. Você adiciona aqueles com os quais deseja se comprometer
index
primeiro (index
é como uma lista a ser registrada):ou
Então
git status
, mostrará quais arquivos foram modificados e quais estãoindex
prontos para confirmação ou check-in.Para confirmar arquivos na sua cópia do repositório, faça:
Consulte o
git
site para obter links para manuais e guias.fonte
git format-patch
para criar um patch para envio (git format-patch -1
criará um patch apenas para o commit mais recente).Aqui está a solução completa para extrair e enviar apenas um arquivo específico dentro do repositório git:
Veja também um link para mais informações.
fonte
Parece que você está tentando transmitir uma idéia do controle de versão centralizado, que o git por natureza não é - é distribuído. Se você deseja trabalhar com um repositório git, você o clona. Você tem todo o conteúdo da árvore de trabalho e todo o histórico (bem, pelo menos tudo o que antecede a ponta da ramificação atual), não apenas um único arquivo ou um instantâneo de uma única confirmação.
fonte
Se você precisar de um arquivo específico de uma ramificação específica de um repositório Git remoto, o comando é:
O restante pode ser derivado da resposta de @ VonC:
Se você precisar de um arquivo específico da ramificação principal, é:
Se você precisar de um arquivo específico de uma tag, é:
fonte
Não vejo o que funcionou para mim listado aqui, por isso incluirei se alguém estiver na minha situação.
Minha situação, eu tenho um repositório remoto de talvez 10.000 arquivos e preciso criar um arquivo RPM para o meu sistema Linux. A construção do RPM inclui um clone git de tudo. Tudo o que preciso é de um arquivo para iniciar a compilação do RPM. Posso clonar a árvore inteira de origem, que faz o que eu preciso, mas leva mais dois minutos para baixar todos esses arquivos quando tudo o que preciso é um. Tentei usar a opção de arquivamento git discutida e fiquei “fatal: operação não suportada pelo protocolo”. Parece que tenho que ter algum tipo de opção de arquivamento ativada no servidor e meu servidor é mantido por bandidos burocráticos que parecem gostar de dificultar a realização de tarefas.
O que finalmente fiz foi entrar na interface da web para o bitbucket e visualizar o arquivo que eu precisava. Cliquei com o botão direito do mouse no link para fazer o download de uma cópia não processada do arquivo e selecionei "atalho de cópia" no pop-up resultante. Não pude apenas baixar o arquivo bruto porque precisava automatizar as coisas e não tenho uma interface de navegador no meu servidor Linux.
Para fins de discussão, isso resultou no URL:
Não foi possível baixar diretamente esse arquivo do repositório bitbucket porque precisava entrar primeiro. Depois de um pouco de pesquisa, descobri que funcionava: No Linux:
Essa combinação me permitiu baixar o arquivo que eu precisava para criar todo o resto.
fonte
Estou adicionando esta resposta como uma alternativa para fazer um check-out formal ou alguma operação local semelhante. Supondo que você tenha acesso à interface da web do seu provedor Git, poderá visualizar diretamente qualquer arquivo em um determinado commit desejado. Por exemplo, no GitHub, você pode usar algo como:
Aqui
ed25584f
estão os 8 primeiros caracteres do hash SHA-1 do commit de interesse, seguido pelo caminho para o arquivo de origem.Similary, no Bitbucket podemos tentar:
Nesse caso, colocamos o hash de confirmação no final do URL de origem.
fonte
Se você só precisa baixar o arquivo, não precisa fazer check-out com o Git.
O GitHub Mate é muito mais fácil, é uma extensão do Chrome, permite que você clique no ícone do arquivo para baixá-lo. também de código aberto
fonte
git
! =github
Se você editou uma versão local de um arquivo e deseja reverter para a versão original mantida no servidor central, isso pode ser facilmente alcançado usando o Git Extensions .
Fácil!
fonte