Quero fazer check-out de uma versão específica de um arquivo específico de um repositório git remoto, sem baixar outros arquivos ou histórico desnecessários.
Dado um $URL
no formato https://github.com/foo/bar.git
e um $REVISION
que deve aceitar um nome de branch, um nome de tag ou um hash de commit curto ou longo, tenho esta solução:
git clone --depth 1 --no-checkout $URL .
git fetch origin $REVISION
git checkout FETCH_HEAD -- foo.txt
mas não funciona em hashes de commit curtos. A etapa fetch falha com fatal: couldn't find remote ref
, mas funciona com o hash de comprimento total. Existe uma solução geral que também funciona em hashes curtos?
A solução aqui , usando git show
, não funciona porque assume que a revisão já existe localmente.
Expandir um hash de commit curto para seu hash completo requer já ter esse commit localmente (no sistema que está fazendo a expansão), pois, caso contrário, os hashes não são conhecidos. Como você está tentando fazer
git fetch
isso agora, isso significa que o Git não pode expandi-lo para um hash completo localmente – e, infelizmente, ele também não pode pedir ao servidor para expandi-lo, pois o protocolo requer hashes ou refs de tamanho completo.Então você terá que buscar todos os commits primeiro, ou então descobrir o hash completo e especificá-lo.
Em vez de um clone raso, eu sugeriria clonar com
--filter=tree:0
oublob:none
( clone filtrado ) para que todos os objetos de commit estejam disponíveis localmente, mesmo que seus conteúdos não estejam. Isso permitirá que o Git expanda localmente os IDs de commit curtos e até mesmo fará com que ele busque automaticamente os objetos individuais necessários quando você tentarcheckout
acessá-los.Repositórios não hospedados no GitHub precisam que ambos os recursos sejam habilitados manualmente (no lado do servidor, ou seja, o repositório do qual você está clonando ) :