Obtendo uma única revisão do Git

14

Ter o histórico completo de revisões do Git traz muitos benefícios como parte do processo de desenvolvimento.

Mas nosso produto é o código-fonte, estamos usando linguagens de script que não precisam de compilação ou processamento e, em seguida, o histórico do Git se torna um fardo na implantação - em nosso exemplo, implantamos um ambiente virtual limpo após cada alteração, com várias implantações em uma única máquina.

Existem algumas maneiras de reduzir a quantidade de histórico, por exemplo, clones rasos cuja eficiência depende de quão profunda é a revisão na ramificação, fazendo uma busca em vez de clone, mas você ainda obtém o histórico da revisão e volta, ou obtendo o resultado completo. repo uma vez puxe quando necessário, mas isso é um desperdício em termos de espaço em disco e tende a ser menos confiável.

Existe uma maneira de obter uma única revisão do Git sem a sua história?

Rsf
fonte
1
Perguntas e respostas relacionadas no SO stackoverflow.com/questions/26135216/…
Evgeny

Respostas:

16

Clone raso

Você pode realmente obter um clone superficial do Git usando:

git clone --depth=1 <url>

Isso ainda clonará o repositório e criará uma .gitpasta com os objetos, apenas de tamanho menor (diferença dependendo do tamanho total do arquivo x do histórico).

Arquivo Git

Você também pode usar o git-archive para extrair um archive do repositório:

Cria um arquivo do formato especificado que contém a estrutura em árvore da árvore nomeada e grava na saída padrão. Se for especificado, ele será anexado aos nomes dos arquivos no arquivo morto.

Nos exemplos que mostra, por exemplo:

git archive --format=tar --prefix=git-1.4.0/ v1.4.0 | gzip >git-1.4.0.tar.gz

Crie um tarball compactado para a versão .

Git hospedado, API de arquivamento

Se você estiver hospedando seu repositório no GitHub, poderá usar a API de arquivamento deles :

https://api.github.com/repos/<username>/<repository>/zipball/<commit_hash>

O Bitbucket.org tem uma mesma funcionalidade para isso:

https://bitbucket.org/<username>/<repository>/get/<branch_name|commit_hash|tag>.zip

7ochem
fonte
7ochem, talvez necessidade de comando gzip ser gzip -c ....
Romeo Ninov
11

Não implante seu repositório git. Desenvolva uma metodologia de implantação real. Mesmo que seja tão simples quanto ordenar um arquivo morto (= construir um artefato com apenas os arquivos necessários para serem implantados) de scripts implementados.

Mesmo se você clonar superficialmente a ponta do seu repositório de origem, provavelmente não precisará de testes de unidade, documentação, perfis de fiapos e outras coisas efêmeras de suporte em seu ambiente implementado.

Nota : para repositórios de linguagens de script que realmente não possuem uma etapa de "construção", uma maneira trivial de liberar um artefato seria empacotá-los em um archive, como tar ou rpm. Em seguida, para "implantar", você descompacta o arquivo morto ou instala o rpm. isso elimina a necessidade de ferramentas git em sua cadeia de implementação (nem todos os servidores prod terão essas ferramentas de desenvolvimento).

RubyTuesdayDONO
fonte
não há problema em questionar (ou até desafiar!) uma resposta - é isso que torna o Stack Exchange ótimo :) para repositórios de linguagens de script que realmente não têm uma etapa de "construção", uma maneira trivial de liberar um artefato seria empacotar em um arquivo, como tar ou rpm. depois, para "implantar", você descompacta o arquivo morto ou instala o rpm. isso elimina a necessidade de ferramentas git na sua cadeia de deploy (nem todos os servidores prod terá essas ferramentas dev)
RubyTuesdayDONO
1
@ Pierre.Vriens sim, você está perdendo o que é sugerido como tarar um arquivo, ou seja, construindo um artefato com apenas os arquivos necessários para serem implantados. Dito isto, concordo que não é uma resposta de qualidade e este ponto deve ser estendido. Estamos em beta privado e respostas devem Nee explícita
Tensibai
Então eu não vejo o que isso traz mais do que a resposta aceita, se for para apontar na direção de arquivo de ajuste ... é apenas redundante, você deve editar para estender este caminho IMHO
Tensibai
1
Por favor, verifique minha edição da sua resposta (apenas integre seu comentário interessante). Sinta-se livre para melhorar / retrabalhar, é claro, ou apenas reverter se você não gosta da minha edição. BTW: seu comentário (= observação que eu adicionei) me fez pensar como "realmente simples assim? Novamente, uma amostra de como fazemos as coisas no zOS ... com z para zero tempo de inatividade ...". Eu acho que está na hora de começar a questionar muito mais perguntas / respostas por meio de comentários semelhantes ... Não me desafie muito ...
Pierre.Vriens
não pretendo que seja uma resposta completa ou modelo, mas não vi mais ninguém abordando o elefante na sala: se você usar o git para "implantar" o seu projeto, "terá um mau momento" ;)
RubyTuesdayDONO 7/17/17
6

Pergunta: existe uma maneira de obter uma única revisão do Git sem sua história?

Para obter um repositório, não, não há como, principalmente porque não há 'revisão'. As confirmações da loja Git, que são alterações do estado anterior.
Se você deseja que seu repositório esteja em um momento específico, você deve puxar o commit neste momento e todos os seus ancestrais ou obterá apenas as alterações feitas no commit.

Para evitar confusão: a clonagem rasa está obtendo o histórico necessário e, em seguida, truncando-o para liberar espaço, a árvore ainda é feita a partir do histórico.

Para as soluções, a resposta @ 7ochem as cobre.

Tensibai
fonte