Obter commit específico do repositório git remoto

Existe uma maneira de obter apenas um commit específico de um repositório Git remoto sem cloná-lo no meu PC? A estrutura de um repositório remoto é absolutamente a mesma que a minha e, portanto, não haverá conflitos, mas não tenho ideia de como fazer isso e não quero clonar esse enorme repositório.

Eu sou novo para git, há um caminho?

154
14 февр. Varun Chitre é definido em 14 de fevereiro. 2013-02-14 13:18 '13 às 13:18 2013-02-14 13:18
@ 9 respostas

Você só clona uma vez, então se você já tem um clone de repositório remoto, puxá-lo para fora não carregará tudo novamente. Basta especificar qual ramificação você deseja extrair ou selecionar as alterações e marcar a confirmação desejada.

Obter de um novo repositório é muito barato em largura de banda, já que ele só faz o download de alterações que você não tem. Pense em termos de git, fazendo a coisa certa com uma carga mínima.

O Git armazena tudo na pasta .git . O final não pode ser recuperado e salvo isoladamente, ele precisa de todos os seus ancestrais. Eles estão interligados.


Para reduzir o tamanho do arquivo enviado, você pode consultar o Git para extrair apenas objetos associados a uma ramificação ou commit em particular:

 git fetch origin refs/heads/branch:refs/remotes/origin/branch 

Isso só carregará as confirmações contidas na branch remota (e apenas as que você perder) e as salvará em origin/branch . Então você pode combinar ou verificar.

Você também pode especificar apenas a correção SHA1:

 git fetch origin 96de5297df870:refs/remotes/origin/foo-commit 

Isso somente carregará a confirmação do SHA-1 96de5297df870 especificado (e seus ancestrais que você perdeu) e o salvará como uma ramificação remota de origin/foo-commit (inexistente).

89
14 февр. resposta dada por CharlesB em 14 de fevereiro. 2013-02-14 13:23 '13 às 13:23 2013-02-14 13:23

Com o Git 2.5+ (Q2 2015), obter um commit (sem clonagem completa de repo) será realmente possível!

Veja commit 68ee628 Fredrik Medley ( moroten ) , 21 de maio de 2015.
( Junio ​​C Hamano - gitster - commit a9d3493 , 01 de junho de 2015)

Agora você tem uma nova configuração (lado do servidor)

 uploadpack.allowReachableSHA1InWant 

Permitir que o upload-pack aceite uma solicitação de amostra que solicite um objeto acessível a partir de qualquer prompt. No entanto, observe que calcular a acessibilidade de um objeto é caro. O padrão é false .

Com a combinação de clone superficial ( git fetch --depth=1 ), você pode solicitar uma confirmação (veja t/t5516-fetch-push.sh :

 git fetch --depth=1 ../testrepo/.git $SHA1 git cat-file commit $SHA1 

Um " git upload-pack " que serve uma " git fetch " pode, que não estão no final de nenhum ref, se eles forem alcançáveis ​​a partir do ref, com uma variável de configuração uploadpack.allowReachableSHA1InWant .


border=0

Documentação completa:

upload-pack : não é necessário permitir a amostragem de sha1 alcançável

Com o parâmetro de configuração uploadpack.allowReachableSHA1InWant definido no lado do servidor, git fetch pode fazer uma solicitação com a string "desejada" que nomeia um objeto que não foi anunciado (provavelmente foi recebido fora do intervalo ou de um ponteiro para um submódulo).
Apenas objetos acessíveis das extremidades da filial serão processados, ou seja, Combine filiais e filiais anunciadas ocultas usando transfer.hideRefs .
Por favor, note que há um custo relacionado para voltar a verificar a disponibilidade.

Essa função pode ser usada para recuperar o conteúdo de uma confirmação específica para a qual sha1 é conhecido, sem a necessidade de clonar um repositório inteiro, especialmente se uma amostragem pequena for usada .

Casos úteis são, por exemplo,

  • repositórios contendo arquivos grandes na história
  • selecionando apenas os dados necessários para verificar o submódulo,
  • ao compartilhar o sha1, sem especificar a qual ramificação ele pertence no Gerrit, se você considerá-lo em termos de confirmações em vez de alterar números.
    (Um caso do Gerrit já foi resolvido com o allowTipSHA1InWant , já que toda mudança do Gerrit tem um link.)

border=0

O Git 2.6 (terceiro trimestre de 2015) irá melhorar este modelo.
Veja commit 2bc31d1 , commit cc118a6 (28 de julho de 2015) Jeff King ( peff ) .
(fundido por Junio ​​C Hamano - gitster - para cometer 824a0be , 19 de agosto de 2015)

refs : support negative transfer.hideRefs

Se você ocultar a hierarquia de referências dos refs usando a configuração transfer.hideRefs , não será possível substituir essa configuração posteriormente para "mostrá-la".
Este patch implementa uma conjugação "negativa", como resultado de quais correspondências são imediatamente marcadas como invisíveis, mesmo que outra correspondência a oculte.
Teremos o cuidado de aplicar os jogos na ordem inversa de como eles são transferidos para nós usando o equipamento de configuração, pois isso permite que nossa “última vitória” usual funcione com a prioridade de configuração (e as entradas em .git/config , por exemplo, substituir /etc/gitconfig ).

Então agora você pode:

 git config --system transfer.hideRefs refs/secret git config transfer.hideRefs '!refs/secret/not-so-secret' 

esconder os refs/secret em todos os repositórios, exceto por um bit público em um repositório específico.


border=0

O Git 2.7 (novembro / dezembro de 2015) irá melhorar novamente:

Veja commit 948bfa2 , commit 00b293e (5 de novembro) 2015, commit 78a766a , commit 92cab49 , commit 92cab49 , commit 92cab49 (03 de novembro de 2015), commit 00b293e , commit 00b293e (05 de novembro de 2015) e commit 92cab49 , commit 92cab49 , commit 92cab49 , commit 92cab49 (03 de novembro de 2015) Lucas Fleisher ( lfos ) .
Assistente: Eric Sunshine ( sunshineco ) .
( Jeff King - peff - em commit dbba85e , 20 de novembro de 2015)

config.txt : documentação da semântica de hideRefs com namespaces

Atualmente, não há uma definição clara de como transfer.hideRefs deve se comportar quando um namespace é especificado.
Explique que, nesse caso, o prefixo hideRefs corresponde a nomes correspondentes. Aqui está como o modelo hideRefs é atualmente processado no pacote de recebimento.

hideRefs: adicionar suporte para corresponder aos refs completos

Além de mapear links separados, agora você pode adicionar modelos hideRefs aos quais uma referência completa (não restrita) é mapeada.
Para distinguir entre correspondências separadas e completas, esses novos modelos devem ter um prefixo com uma volta ( ^ ).

Portanto, a nova documentação :

 transfer.hideRefs: 

Se um namespace for usado, o prefixo do namespace será removido de cada link antes de ser mapeado para os padrões transfer.hideRefs .
Por exemplo, se refs/heads/master especificado em transfer.hideRefs e o namespace atual for foo , refs/namespaces/foo/refs/heads/master omitido dos anúncios, mas refs/heads/master e refs/namespaces/bar/refs/heads/master ainda é anunciado como as chamadas linhas "have".
Para corresponder às referências antes de remover, adicione um ^ antes do nome do link. Se você combinar ! e ^ , você deve primeiro especificar ! .

81
08 июня '15 в 8:22 2015-06-08 08:22 a resposta é dada por VonC em 08 junho '15 em 8:22 2015-06-08 08:22

Eu puxei o repositório do git:

 git pull --rebase <repo> <branch> 

Permita que o git puxe todo o código para o branch, e então eu enviei reset para o commit que me interessou.

git reset --hard <commit-hash>

Espero que isso ajude.

54
03 дек. A resposta é dada por Piu Sharma 03 de dezembro 2013-12-03 15:43 '13 às 15:43 2013-12-03 15:43

Você pode apenas obter uma confirmação de repo remoto usando

 git fetch <repo> <commit> 

onde

  • <repo> pode ser um nome de repositório remoto (por exemplo, origin ) ou até mesmo um URL de repositório remoto (por exemplo, https://git.foo.com/myrepo.git )
  • <commit> pode ser passado para o SHA1

por exemplo

 git fetch https://git.foo.com/myrepo.git 0a071603d87e0b89738599c160583a19a6d95545 

depois de ter recebido a fixação (e antepassados ​​desaparecidos), você pode simplesmente verificar com

 git checkout FETCH_HEAD 

Por favor, note que isso vai levar você ao estado "cabeça desconectada".

40
06 июня '14 в 17:50 2014-06-06 17:50 a resposta é dada Fluxo 06 de junho de '14 às 17:50 2014-06-06 17:50

Você pode simplesmente obter um repositório remoto com:

 git fetch <repo> 

onde

  • <repo> pode ser um nome de repositório remoto (por exemplo, origin ) ou até mesmo um URL de repositório remoto (por exemplo, https://git.foo.com/myrepo.git )

por exemplo:

 git fetch https://git.foo.com/myrepo.git 

depois de ter extraído as reposições, você pode combinar os commits que você fez (já que a questão é extrair um commit, e ao invés de se fundir, você pode usar a seleção cherry para selecionar apenas um commit)

 git merge <commit> 
  • <commit> pode ser passado para o SHA1

por exemplo:

 git cherry-pick 0a071603d87e0b89738599c160583a19a6d95545 

ou

 git merge 0a071603d87e0b89738599c160583a19a6d95545 

Se este é o último commit que você deseja mesclar, você também pode usar a variável FETCH_HEAD:

 git cherry-pick (or merge) FETCH_HEAD 
11
16 июля '15 в 20:32 2015-07-16 20:32 a resposta foi dada por Sérgio em 16 de julho de 2015 às 20:32 2015-07-16 20:32

Finalmente, eu encontrei uma maneira de clonar um commit particular usando o git cherry pick . Supondo que você não tenha nenhum repositório na rede local e realize uma confirmação específica de um controle remoto,

1) crie um repositório vazio no init local e git

2) git fonte remota "url-of-repository"

3) git fetch origin [isso não moverá seus arquivos para o espaço de trabalho local se você não for mesclado)

4) git cherry-pick "Digite-long-commit-hash-que-você-precisa"

Está feito. Dessa forma, você só terá arquivos deste commit em particular no local.

Enter-long-fixed-hash:

Você pode usar isto → git log --pretty = oneline

2
03 янв. a resposta é dada surya deepak 03 jan. 2017-01-03 07:19 '17 às 7:19 2017-01-03 07:19

Eu acho que o git ls-remote '( http://git-scm.com/docs/git-ls-remote ) deve fazer o que você quiser. Sem extração forçada ou tensão.

1
28 янв. A resposta do Hubbitus é 28 de janeiro 2015-01-28 18:42 '15 às 18:42 2015-01-28 18:42

Etapa 1: selecione a lista de confirmações:

log do git

Você receberá uma lista, como neste exemplo:

commit 7244ab27d1c3411cdb8c0111706a4f0cd1236ce1 (commit hash) Autor: aspmac Data: qui 4 de maio 18:03:40 2017 +0530

 Fix header in ios(In-progress). 

Esta é a última mensagem de commit

commit b586ed0f5fd6b89a73b632181774464ef1c37bd5 (commit hash) Autor: Autor Data: Qua Mai 03 11:44:28 2017 +0530

 remove all console. 

Esta é a mensagem de confirmação anterior.

... Passo 2: copie o hash necessário e cole-o para verificar:

git checkout b586ed0f5fd6b89a73b632181774464ef1c37bd5

0
04 мая '17 в 17:16 2017-05-04 17:16 a resposta é dada Rahi.Shah 04 maio '17 em 17:16 2017-05-04 17:16

Por favor, anexe todos os upvotes a um post do Sergio, se você gostar. A decisão foi considerada em sua resposta. Eu acho que funciona puxando qualquer correção de qualquer repo.

Sequência:

 git init git fetch <repo> git merge <commitSHA> git push 

Aqui está:

 git init git fetch https://github.com/github/octicons.git git merge 8fc17d58e75d9711fcd7f51a158f93ce9076cb23 git push 
-4
27 окт. Hien responder em 27 de outubro. 2015-10-27 06:01 '15 às 6:01 am 2015-10-27 06:01

Outras perguntas sobre tags ou Ask a Question