Zipar repetidamente um arquivo recém criado, mas idêntico, porém o shasum do zip continua mudando

2

Este é um acompanhamento para Estou repetidamente fechando a mesma pasta de arquivos, mas o shasum continua mudando essencialmente ..

Eu estou tentando adicionar um arquivo contendo o git sha do commit atual quando eu zipar uma parte do meu repositório e pegar seu sha sum ..

O código para isso é git rev-parse HEAD > .gitsha . No entanto, adicionar isso ao meu zip significa que shasum do meu zip continua mudando a cada segundo. O comando zip usa -X para ignorar os registros de data e hora do arquivo.

Eu experimentei apenas o arquivo .gitsha abaixo

$ git rev-parse HEAD > .gitsha ; shasum .gitsha
8fa263bc885822ccba03006ea10015ef32da485c  .gitsha

Isso é consistente ao longo do tempo.

No entanto, depois de zipar, o shasum não é mais consistente

$ git rev-parse HEAD > .gitsha ; zip -X --quiet -r test.zip .gitsha ; shasum test.zip
26cc38c624f91a1c555d503fdfdecb1ce670274f  test.zip

$ git rev-parse HEAD > .gitsha ; zip -X --quiet -r test.zip .gitsha ; shasum test.zip
b03f7cb654e3aa0d25d18ead5fe1f225bc2aac9f  test.zip

Estas são duas tentativas com alguns segundos de diferença. Eu presumo que o sinalizador -X não inclui o tempo de criação, talvez? Qualquer maneira de fazer isso funcionar?

Atualização: excluir o zip não ajuda.

$ rm test.zip; git rev-parse HEAD > .gitsha ; zip -X --quiet -r test.zip .gitsha ; shasum test.zip
76c722ccf2df75fb624f9640ad948f4508dd6152  test.zip
$ rm test.zip; git rev-parse HEAD > .gitsha ; zip -X --quiet -r test.zip .gitsha ; shasum test.zip
6bd26d2bc821d9f12806fc81a8ba8c8babcc664a  test.zip
    
por Karthik T 26.01.2015 / 11:16

3 respostas

0

Acabei gerando um .gitsha para o repositório na pasta raiz e apenas reescrevi-lo se estiver desatualizado. Isso me dá o que eu quero .. à custa de explodir uma linha de código para 20 ..

new_sha=$(git rev-parse HEAD)
if [ -f ../.gitsha ]
then
   old_sha=$(cat ../.gitsha)
   if [ $old_sha = $new_sha ]
    then
    generate=false
    echo "gitsha file up to date"
   else
    generate=true
    echo "gitsha file out of date"
   fi
else
    echo "git sha file missing"
   generate=true
fi

if [ $generate = true ]
    then
    echo $new_sha > ../.gitsha
fi

em vez de git rev-parse HEAD > .gitsha

    
por 05.02.2015 / 07:24
0

Verifique a saída do comando strings nos arquivos zip:

$ strings test.zip blah.zip                         
.gitshab9e1355d36643fefe94da0bee81533cd8cbb04d9
.gitshaPK
QH;F
.gitshab9e1355d36643fefe94da0bee81533cd8cbb04d9
QH;F
.gitshaPK

O conteúdo das três strings permanece o mesmo, mas a ordem muda. Portanto, pode haver algum componente do arquivo zip que não seja precisamente dependente da ordem. Vou atualizar quando puder determinar como tornar a saída constante.

    
por 27.01.2015 / 04:40
0

O comando zip é anexado ao arquivo zip de saída. Tente excluí-lo entre as execuções.

Update: Eu testei -X para mim e parece que ainda insere o timestamp de arquivo no arquivo (como visto em unzip -l )

Se você der uma olhada no protocolo na wikipedia , poderá ver que a data e a data os campos de tempo estão sempre presentes e, no final do cabeçalho, eles têm espaço para campos específicos do sistema operacional. Eu diria que -X está deixando de fora os campos extras específicos do sistema operacional.

Então, acho que a única maneira de produzir um arquivo zip consistente é ter timestamps consistentes. Você pode tentar tocar o arquivo em uma data específica antes de adicioná-lo ao arquivo zip.

    
por 27.01.2015 / 02:12