Existe alguma maneira de recuperar apenas um commit específico de um repositório Git remoto sem cloná-lo no meu PC? A estrutura do repositório remoto é absolutamente igual à minha e, portanto, não haverá conflitos, mas não tenho idéia de como fazer isso e não quero clonar esse enorme repositório.
Eu sou novo no git, existe alguma maneira?
Respostas:
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)
Se você combinar essa configuração do lado do servidor com um clone superficial (
git fetch --depth=1
), poderá solicitar uma única confirmação (consultet/t5516-fetch-push.sh
:Você pode usar o
git cat-file
comando para verificar se o commit foi buscado:A documentação completa é:
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)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)Daí a nova documentação :
R .. menciona nos comentários a configuração
uploadpack.allowAnySHA1InWant
, que permiteupload-pack
aceitar umafetch
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
) :fonte
uploadpack.allowAnySHA1InWant
a penalidade de alcançabilidade-computação (e vetor DoS).Você clona apenas uma vez; portanto, se você já possui um clone do repositório remoto, extrair dele não fará o download de tudo novamente. Apenas indique qual ramo você deseja obter ou busque as alterações e faça o checkout do commit que deseja.
Buscar em um novo repositório é muito barato em largura de banda, pois só fará o download das alterações que você não possui. Pense em termos de Git fazendo a coisa certa, com carga mínima.
O Git armazena tudo na
.git
pasta. Um commit não pode ser buscado e armazenado isoladamente, ele precisa de todos os seus ancestrais. Eles estão inter-relacionados .Para reduzir o tamanho do download, você pode solicitar ao git que busque apenas objetos relacionados a uma ramificação ou confirmação específica:
Isso fará o download apenas de confirmações contidas na ramificação remota
branch
(e apenas as que você sente falta) e as armazenaráorigin/branch
. Você pode mesclar ou finalizar a compra.Você também pode especificar apenas uma confirmação SHA1:
Isso fará o download apenas do commit do SHA-1 96de5297df870 especificado (e de seus ancestrais que você sente falta) e o armazenará como filial remota (não existente)
origin/foo-commit
.fonte
2.7.4-0ubuntu1.3
. No entanto, ao usar a2.16.2-0ppa1~ubuntu16.04.1
partir do PPA do git-core, isso funciona como deveria. Parece um bug que foi corrigido. Não foi possível encontrar uma referência a isso com uma pesquisa rápida. Se alguém puder me dar um ponteiro sobre isso, eu adoraria receber essa correção de volta.Eu fiz um puxão no meu repositório git:
Permitindo que o git puxasse todo o código da ramificação e depois fui redefinir o commit que me interessava.
git reset --hard <commit-hash>
Espero que isto ajude.
fonte
git reset --hard
, quando compartilhados em soluções generalizadas, podem levar as pessoas a traps onde perdem dados (ou, nesse caso: em um estado em que recuperar seus dados não é trivial).Você pode simplesmente buscar um único commit de um repositório remoto com
Onde,
<repo>
pode ser um nome de repositório remoto (por exemploorigin
) ou até mesmo um URL de repositório remoto (por exemplohttps://git.foo.com/myrepo.git
)<commit>
pode ser o commit do SHA1por exemplo
depois de buscar o commit (e os ancestrais ausentes), você pode simplesmente fazer checkout com
Observe que isso o levará ao estado "cabeça desanexada".
fonte
fetch
uma rev específica como você faz lá, o git falha com o código de erro 1 e sem saída. Isso era algo que costumava funcionar em versões anteriores? (Eu sou v2.0.2.)fetch
, embora nesse caso não tenha certeza de qual seja o uso.git checkout FETCH_HEAD
ajuda.--depth=1
)!Você pode simplesmente buscar o repositório remoto com:
Onde,
<repo>
pode ser um nome de repositório remoto (por exemploorigin
) ou até mesmo um URL de repositório remoto (por exemplohttps://git.foo.com/myrepo.git
)por exemplo:
depois de buscar os repositórios, você pode mesclar os commits que você deseja (já que a pergunta é sobre recuperar um commit, em vez disso, você pode usar cherry-pick para escolher apenas um commit):
<commit>
pode ser o commit do SHA1por exemplo:
ou
se é a confirmação mais recente que você deseja mesclar, você também pode usar a variável FETCH_HEAD:
fonte
git config set uploadpack.allowReachableSHA1InWant
?Isso funciona melhor:
nomeie "temp" o que quiser ... esse ramo pode ficar órfão
fonte
Finalmente, encontrei uma maneira de clonar commit específico usando git cherry-pick . Supondo que você não tenha nenhum repositório no local e esteja obtendo commit específico do remoto,
1) crie um repositório vazio no local e git init
2) git remote add origin " url-de-repository "
3) origem do git fetch [isso não moverá seus arquivos para o espaço de trabalho local, a menos que você mescle]
4) git cherry-pick " Digite-comprimir-hash-que-você precisa "
Feito. Dessa forma, você terá apenas os arquivos desse commit específico no seu local.
Enter-long-commit-hash:
Você pode obter isso usando -> git log --pretty = oneline
fonte
Eu acho que 'git ls-remote' ( http://git-scm.com/docs/git-ls-remote ) deve fazer o que você deseja. Sem força buscar ou puxar.
fonte
Se o commit solicitado estiver nas solicitações pull do repositório remoto, você poderá obtê-lo pelo seu ID:
fonte