Começando com o Git versão 2.5+ (Q2 2015), é possível buscar um único commit (sem clonar o repositório completo).
Ver commit 68ee628 por Fredrik Medley ( moroten
) , 21 de maio de 2015.
(mesclado por Junio C Hamano - gitster
- no commit a9d3493 , 01 jun 2015)
Agora você tem uma nova configuração (no lado do servidor)
uploadpack.allowReachableSHA1InWant
Permite upload-pack
aceitar uma solicitação de busca que solicita um objeto acessível a partir de qualquer dica de referência. No entanto, observe que calcular a acessibilidade de objetos é computacionalmente caro.
O padrão é false
.
Se você combinar essa configuração do lado do servidor com um clone superficial ( git fetch --depth=1
), poderá solicitar uma única confirmação (consulte t/t5516-fetch-push.sh
:
git fetch --depth=1 ../testrepo/.git $SHA1
Você pode usar o git cat-file
comando para verificar se o commit foi buscado:
git cat-file commit $SHA1
" git upload-pack
" que serve " git fetch
" pode ser dito para servir confirmações que não estão na ponta de qualquer referência, desde que sejam alcançáveis a partir de uma referência, com a uploadpack.allowReachableSHA1InWant
variável de configuração.
A documentação completa é:
upload-pack
: permitir opcionalmente buscar sha1 acessível
Com a uploadpack.allowReachableSHA1InWant
opção de configuração definida no lado do servidor, " git fetch
" pode fazer uma solicitação com uma linha "querer" que nomeie um objeto que não foi anunciado (provavelmente obtido fora da banda ou de um ponteiro de submódulo).
Apenas objetos alcançáveis a partir das dicas de ramificação, ou seja, a união de ramificações anunciadas e ramificações ocultas por transfer.hideRefs
, serão processados.
Observe que há um custo associado de ter que retornar ao histórico para verificar a acessibilidade.
Esse recurso pode ser usado ao obter o conteúdo de um determinado commit, pelo qual o sha1 é conhecido, sem a necessidade de clonar todo o repositório, especialmente se uma busca superficial for usada .
Casos úteis são, por exemplo,
- repositórios contendo arquivos grandes no histórico,
- buscando apenas os dados necessários para uma finalização do submódulo,
- ao compartilhar um sha1 sem dizer a qual ramo exato ele pertence e no Gerrit, se você pensa em termos de confirmação em vez de alterar números.
(O caso Gerrit já foi resolvido, allowTipSHA1InWant
pois todas as alterações da Gerrit têm uma ref.)
O Git 2.6 (terceiro trimestre de 2015) melhorará esse modelo.
Consulte commit 2bc31d1 , commit cc118a6 (28 de julho de 2015) por Jeff King ( peff
) .
(Mesclado por Junio C Hamano - gitster
- no commit 824a0be , 19 de agosto de 2015)
refs
: suporte negativo transfer.hideRefs
Se você ocultar uma hierarquia de referências usando a transfer.hideRefs
configuração, não há como substituí-la posteriormente para "ocultá-la".
Este patch implementa uma ocultação "negativa" que faz com que as correspondências sejam imediatamente marcadas como não ocultas, mesmo que outra correspondência oculte.
Nós tomamos o cuidado de aplicar as correspondências na ordem inversa de como elas nos são alimentadas pelo mecanismo de configuração, pois isso permite que o nosso "último vencedor" usual trabalhe com precedência de configuração (e as entradas .git/config
, por exemplo, serão substituídas /etc/gitconfig
).
Então agora você pode fazer:
git config --system transfer.hideRefs refs/secret
git config transfer.hideRefs '!refs/secret/not-so-secret'
ocultar refs/secret
em todos os repositórios, exceto um bit público em um repositório específico.
O Git 2.7 (Nov / Dez 2015) será aprimorado novamente:
Consulte commit 948bfa2 , commit 00b293e (05 de novembro de 2015), commit 78a766a , commit 92cab49 , commit 92cab49 , commit 92cab49 (03 nov 2015), commit 00b293e , commit 00b293e (05 nov 2015) e commit 92cab49 , commit 92cab49 , commit 92cab49 , commit 92cab49 (03 de novembro de 2015) por Lukas Fleischer ( lfos
) .
Ajudado por: Eric Sunshine ( sunshineco
) .
(Mesclado por Jeff King - peff
- no commit dbba85e , 20 de novembro de 2015)
config.txt
: documentar a semântica hideRefs
com namespaces
No momento, não há uma definição clara de como transfer.hideRefs
deve se comportar quando um espaço para nome é definido.
Explique que os hideRefs
prefixos correspondem aos nomes separados nesse caso. É assim que os hideRefs
padrões são atualmente tratados no pacote de recebimento.
hideRefs: adicione suporte para referências completas correspondentes
Além de combinar refs removidos, agora é possível adicionar hideRefs
padrões com os quais o ref completo (sem strip) é comparado.
Para distinguir entre correspondências despojadas e completas, esses novos padrões devem ser prefixados com um circunflexo ( ^
).
Daí a nova documentação :
transfer.hideRefs:
Se um espaço para nome estiver em uso, o prefixo do espaço para nome será retirado de cada referência antes de corresponder aos transfer.hiderefs
padrões.
Por exemplo, se refs/heads/master
for especificado no transfer.hideRefs
eo namespace atual é foo
, em seguida, refs/namespaces/foo/refs/heads/master
é omitida a partir dos anúncios, mas refs/heads/master
e
refs/namespaces/bar/refs/heads/master
ainda são anunciados como chamadas linhas "têm".
Para corresponder aos árbitros antes da remoção, adicione um ^
na frente do nome do árbitro. Se você combinar !
e ^
, !
deve ser especificado primeiro.
R .. menciona nos comentários a configuração uploadpack.allowAnySHA1InWant
, que permite upload-pack
aceitar uma fetch
solicitação que solicita qualquer objeto. (O padrão é false
).
Veja commit f8edeaa (novembro de 2016, Git v2.11.1) por David "novalis" Turner ( novalis
) :
upload-pack
: opcionalmente, permite buscar qualquer sha1
Parece um pouco tolo fazer uma verificação de acessibilidade no caso em que confiamos que o usuário acesse absolutamente tudo no repositório.
Além disso, é atrevido em um sistema distribuído - talvez um servidor anuncie uma ref, mas outro desde então teve um empurrão forçado nessa ref, e talvez as duas solicitações HTTP acabem direcionadas para esses servidores diferentes.