Git a un arbre vide bien connu, ou du moins bien connu, dont SHA1 est:
4b825dc642cb6eb9a060e54bf8d69288fbee4904
(vous pouvez le voir dans n'importe quel dépôt, même nouvellement créé, avec git cat-file -t
et git cat-file -p
).
Si vous travaillez dur et que vous faites très attention, vous pouvez en quelque sorte utiliser cette arborescence vide pour stocker un répertoire qui n'a pas de fichiers (voir la réponse à Comment ajouter un répertoire vide à un dépôt git ), bien que ce ne soit pas vraiment une bonne idée.
C'est plus utile en tant qu'argument à git diff-tree
, lequel des exemples de hooks fait.
Ce que je me demande c'est,
- dans quelle mesure est-ce fiable - c'est-à-dire, une future version de git n'aura-t-elle pas d'objet git numéroté
4b825dc642cb6eb9a060e54bf8d69288fbee4904
? - Pourquoi n'y a-t-il pas de nom symbolique pour l'arbre vide (ou y en a-t-il un?).
(Un moyen rapide et sale de créer un nom symbolique est de mettre le SHA1, par exemple .git/Nulltree
. Malheureusement, vous devez le faire pour chaque dépôt. Il semble préférable de simplement mettre le nombre magique dans les scripts, etc. J'ai juste une aversion générale aux nombres magiques.)
git hash-object -t tree /dev/null
méthode (d'après la réponse de VonC ci-dessous) a l'avantage de ne pas coder en dur SHA-1, au cas où une future version de git passerait à SHA-2 par exemple. (Je ne vais pas essayer de prédire quand cela pourrait arriver. :-) Il serait plus facile de passer de Mercurial à SHA-2, car ils ont laissé de la place pour cela.)Réponses:
Ce fil mentionne:
Ou, comme le propose Ciro Santilli dans les commentaires :
Ou, comme on le voit ici , de Colin Schimmelfing :
Donc je suppose qu'il est plus sûr de définir une variable avec le résultat de cette commande comme votre arbre sha1 vide (au lieu de compter sur une "valeur bien connue").
Remarque: Git 2.25.1 (février 2020) propose dans le commit 9c8a294 :
Et ajoute:
Remarque, vous verrez que SHA1 apparaît sur un dépôt GitHub lorsque l'auteur veut que son premier commit soit vide (voir l'article de blog " Comment j'initialise mes dépôts Git "):
Te donnera:
(Voir l'arbre SHA1?)
Vous pouvez même rebaser votre historique existant en plus de ce commit vide (voir " git: comment insérer un commit comme premier, en décalant tous les autres? ")
Dans les deux cas, vous ne vous fiez pas à la valeur SHA1 exacte de cet arbre vide.
Vous suivez simplement une bonne pratique, initialisant votre repo avec un premier commit vide .
Pour faire ça:
Cela générera un commit avec un SHA1 spécifique à votre repo, nom d'utilisateur, email, date de création (ce qui signifie que le SHA1 du commit lui-même sera différent à chaque fois).
Mais l'arborescence référencée par ce commit sera
4b825dc642cb6eb9a060e54bf8d69288fbee4904
, l'arborescence vide SHA1.Pour afficher uniquement l'arborescence d'un commit (afficher l'arbre de commit SHA1):
Si ce commit, référençant un arbre vide, est bien votre premier commit, vous pouvez montrer cet arbre vide SHA1 avec:
(et cela fonctionne même sous Windows, avec les commandes Gnu On Windows )
Comme commenté ci - dessous , en utilisant
git diff <commit> HEAD
, cela affichera tous vos fichiers dans la branche actuelle HEAD:Remarque: cette valeur d'arbre vide est formellement définie dans
cache.h
.Depuis Git 2.16 (Q1 2018), il est utilisé dans une structure qui n'est plus liée (uniquement) à SHA1, comme on le voit dans commit eb0ccfd :
Pour en savoir plus, consultez " Pourquoi Git n'utilise-t-il pas un SHA plus moderne? ": C'est SHA-2 , depuis Git 2.19 (Q3 2018)
Avec Git 2.25 (Q1 2020), les tests se préparent à une transition SHA-2 et impliquent l'arbre vide.
Voir commettre fa26d5e , engager cf02be8 , engager 38ee26b , engager 37ab8eb , engager 0370b35 , engager 0253e12 , engager 45e2ef2 , engager 79b0edc , engager 840624f , engager 32a6707 , engager 440bf91 , engager 0b408ca , commettre 2eabd38 (28 octobre 2019), et engager 1bcef51 , commettre ecde49b (05 octobre 2019) par brian m. carlson (
bk2204
) .(Fusionné par Junio C Hamano -
gitster
- dans commit 28014c1, 10 novembre 2019)t/oid-info/hash-info
Comprend donc maintenant:Le SHA2 "
6ef19b41225c5369f1c104d45d8d85efa9b057b53b14b4b9b939dd74decc5321
" est le nouvel4b825dc642cb6eb9a060e54bf8d69288fbee4904
arbre vide SHA1 " ".la source
git diff-tree
dans certains scripts que j'écris. Il n'y a aucune garantie qu'il existe un commit initial vide dans le dépôt. Je me demande donc si ces scripts pourraient finir par se rompre un jour.-w
àgit hash-object
, il créera l'objet dans le référentiel sur lequel il est exécuté, et cela recréera l'arborescence vide dans le référentiel sur lequel vous courrez s'il devait disparaître à l'avenir./dev/null
:printf '' | git hash-object --stdin -t tree
:)J'ai rédigé un article de blog avec deux façons différentes de trouver le hachage: http://colinschimmelfing.com/blog/gits-empty-tree/
S'il devait changer pour une raison quelconque, vous pouvez utiliser les deux méthodes ci-dessous pour le trouver. Cependant, je me sentirais assez confiant en utilisant le hachage dans les alias .bashrc, etc., et je ne pense pas que cela changera de si tôt. À tout le moins, ce serait probablement une version majeure de git.
Les deux moyens sont:
git hash-object -t tree --stdin < /dev/null
git write-tree
dans ce nouveau dépôt - le hachage sera généré par git write-tree.la source
–-stdin
me donnefatal: Cannot open '–-stdin': No such file or directory
git 2.7.2. Cependant, l'exécuter sans--stdin
comme dans la réponse de VonC donne la valeur de hachageVoici la réponse sur la façon de créer un commit d'arbre vide même dans le cas où le référentiel n'est pas déjà vide. https://stackoverflow.com/a/14623458/9361507
Mais je préfère "vide" pour être tag, mais pas une branche. Un moyen simple est:
Parce que la balise peut pointer directement vers tree-ish, sans validation. Maintenant, pour obtenir tous les fichiers dans l'arborescence de travail:
Ou la même chose avec stat:
Tous les fichiers comme diff:
Vérifiez les espaces dans tous les fichiers:
la source
git rev-parse
j'aurais de nouveaux indicateurs ou mots clés ou quelque chose du genre, pour produire (a) le hachage d'arbre vide et (b) le hachage null-commit. Ces deux éléments seraient utiles dans les scripts et protégeraient contre les modifications proposées de SHA-256.