O Git tem uma árvore vazia conhecida ou pelo menos uma espécie conhecida, cujo SHA1 é:
4b825dc642cb6eb9a060e54bf8d69288fbee4904
(você pode ver isso em qualquer repositório, mesmo um recém-criado, com git cat-file -t
e git cat-file -p
).
Se você trabalha duro e é muito cuidadoso, pode usar essa árvore vazia para armazenar um diretório que não possui arquivos (consulte a resposta em Como adiciono um diretório vazio a um repositório git ), embora não seja realmente uma boa idéia.
É mais útil como um argumento git diff-tree
, como um dos ganchos de amostra.
O que eu quero saber é,
- Quão confiável é isso - ou seja, alguma versão futura do git não terá um objeto git numerado
4b825dc642cb6eb9a060e54bf8d69288fbee4904
? - Por que não existe um nome simbólico para a árvore vazia (ou existe um?).
(Uma maneira rápida e suja de criar um nome simbólico é colocar o SHA1, por exemplo .git/Nulltree
. Infelizmente, você deve fazer isso para todos os repositórios. Parece melhor colocar o número mágico nos scripts, etc. Eu tenho uma aversão geral para números mágicos.)
git hash-object -t tree /dev/null
método (da resposta de VonC abaixo) tem a vantagem de não codificar o SHA-1, caso alguma versão futura do git mude para o SHA-2, por exemplo. (Eu não estou indo para tentar prever quando isso pode acontecer :-) Seria mais fácil para alternar Mercurial para SHA-2, desde que eles deixaram espaço para isso..)Respostas:
Este tópico menciona:
Ou, como Ciro Santilli propõe nos comentários :
Ou, como visto aqui , de Colin Schimmelfing :
Portanto, acho que é mais seguro definir uma variável com o resultado desse comando como sua árvore sha1 vazia (em vez de confiar em um "valor conhecido").
Nota: O Git 2.25.1 (fevereiro de 2020) propõe em commit 9c8a294 :
E acrescenta:
Observe que você verá que o SHA1 aparece em algum repositório do GitHub quando o autor deseja que seu primeiro commit fique vazio (consulte a publicação no blog " repositório Como inicializar meus repositórios Git "):
Darei à você:
(Veja a árvore SHA1?)
Você pode até refazer o histórico existente sobre esse commit vazio (consulte " git: como inserir um commit como o primeiro, alterando todos os outros? ")
Nos dois casos, você não depende do valor exato de SHA1 dessa árvore vazia.
Você simplesmente segue uma prática recomendada, inicializando seu repositório com um primeiro commit vazio .
Fazer isso:
Isso gerará uma confirmação com um SHA1 específico para seu repositório, nome de usuário, email, data de criação (o que significa que o SHA1 do próprio envio será diferente a cada vez).
Mas a árvore referenciada por esse commit será
4b825dc642cb6eb9a060e54bf8d69288fbee4904
a árvore vazia SHA1.Para mostrar apenas a árvore de uma confirmação (exiba a árvore de confirmação SHA1):
Se esse commit, referenciando uma árvore vazia, for realmente o seu primeiro commit, você poderá mostrar esse SHA1 da árvore vazia com:
(e isso ainda funciona no Windows, com o Gnu On Windows comandos do )
Como comentado abaixo , usando
git diff <commit> HEAD
, isso mostrará todo o seu arquivo no ramo atual HEAD:Nota: esse valor vazio da árvore é formalmente definido em
cache.h
.Desde o Git 2.16 (primeiro trimestre de 2018), ele é usado em uma estrutura que não está mais vinculada ao (apenas) SHA1, como visto em commit eb0ccfd :
Veja mais em " Por que o Git não usa SHA mais moderno? ": É SHA-2 , desde o Git 2.19 (terceiro trimestre de 2018)
Com o Git 2.25 (primeiro trimestre de 2020), os testes estão se preparando para uma transição SHA-2 e envolvem a árvore vazia.
Veja cometer fa26d5e , cometer cf02be8 , cometer 38ee26b , cometer 37ab8eb , cometer 0370b35 , cometer 0253e12 , cometer 45e2ef2 , cometer 79b0edc , cometer 840624f , cometer 32a6707 , cometer 440bf91 , cometer 0b408ca , cometer 2eabd38 (28 de outubro de 2019), e comprometer 1bcef51 , cometer ecde49b (05 Out 2019) por brian m. Carlson (
bk2204
) .(Mesclado por Junio C Hamano -
gitster
- no commit 28014c1, 10 nov 2019)Então
t/oid-info/hash-info
agora inclui:O SHA2 "
6ef19b41225c5369f1c104d45d8d85efa9b057b53b14b4b9b939dd74decc5321
" é a nova4b825dc642cb6eb9a060e54bf8d69288fbee4904
árvore vazia do SHA1 " ".fonte
git diff-tree
em alguns scripts que estou escrevendo. Não há garantia de que haja um commit vazio inicial no repositório. Então, eu estou me perguntando se esses scripts podem acabar quebrando algum dia.-w
paragit hash-object
, ele vai criar o objeto no repositório é executado contra, e que iria recriar a árvore vazia no repositório você está correndo contra foram para nunca ir longe no futuro./dev/null
:printf '' | git hash-object --stdin -t tree
:)Eu escrevi um post de blog com duas maneiras diferentes de encontrar o hash: http://colinschimmelfing.com/blog/gits-empty-tree/
Se alguma vez mudar por algum motivo, você pode usar as duas maneiras abaixo para encontrá-lo. No entanto, eu me sentiria bastante confiante usando o hash nos aliases .bashrc etc., e não acho que isso mude tão cedo. No mínimo, provavelmente seria um grande lançamento do git.
As duas maneiras são:
git hash-object -t tree --stdin < /dev/null
git write-tree
nesse novo repositório - o hash será gerado pelo git write-tree.fonte
–-stdin
me fornece ofatal: Cannot open '–-stdin': No such file or directory
git 2.7.2. No entanto, executá-lo sem--stdin
como na resposta do VonC dá o valor de hashAqui está a resposta sobre como criar confirmação de árvore vazia, mesmo no caso em que o repositório ainda não estiver vazio. https://stackoverflow.com/a/14623458/9361507
Mas eu prefiro que "vazio" seja tag, mas não um ramo. Maneira simples é:
Porque a tag pode apontar diretamente para a árvore, sem confirmação. Agora, para obter todos os arquivos na árvore de trabalho:
Ou o mesmo com stat:
Todos os arquivos como diff:
Verifique os espaços em branco em todos os arquivos:
fonte
git rev-parse
teria novos sinalizadores ou palavras-chave ou algo nesse sentido, para produzir (a) o hash da árvore vazia e (b) o hash de confirmação nula. Ambos seriam úteis em scripts e protegeriam contra as alterações propostas no SHA-256.