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-packaceitar 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-filecomando 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.allowReachableSHA1InWantopçã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, allowTipSHA1InWantpois 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.hideRefsconfiguraçã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/secretem 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 hideRefscom namespaces
No momento, não há uma definição clara de como transfer.hideRefsdeve se comportar quando um espaço para nome é definido.
Explique que os hideRefsprefixos correspondem aos nomes separados nesse caso. É assim que os hideRefspadrõ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 hideRefspadrõ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.hiderefspadrões.
Por exemplo, se refs/heads/masterfor especificado no transfer.hideRefseo namespace atual é foo, em seguida, refs/namespaces/foo/refs/heads/master
é omitida a partir dos anúncios, mas refs/heads/mastere
refs/namespaces/bar/refs/heads/masterainda 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-packaceitar uma fetchsolicitaçã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.