Est git semi-secret arbre vide d'objet fiable, et pourquoi n'est-il pas un nom symbolique pour elle?
Git a bien connu, ou au moins un peu-de-bien-connu, arbre vide dont le SHA1 est:
4b825dc642cb6eb9a060e54bf8d69288fbee4904
(vous pouvez les voir dans toute repo, même un nouveau, avec git cat-file -t
et git cat-file -p
).
Si vous travaillez dur et sont très prudent, vous pouvez sorte de l'utilisation de cet arbre vide pour stocker un répertoire qui n'a pas de fichiers (voir réponse à Comment puis-je ajouter un répertoire vide dans un dépôt git), bien qu'il n'est pas vraiment une bonne idée.
Il est plus utile comme un argument pour git diff-tree
, dont l'un des exemples les crochets ne.
Ce que je me demande,
- quelle est la fiabilité de ce—c'est à dire, certaines future version de git pas un git objet numéroté
4b825dc642cb6eb9a060e54bf8d69288fbee4904
? - Pourquoi n'est-il pas le nom symbolique de l'arbre vide (ou est-il un?).
(D'une façon rapide et sale pour créer un nom symbolique est de mettre le SHA1, par exemple, .git/Nulltree
. Malheureusement, vous avez à faire cela pour toutes les pensions. Semble mieux de mettre juste le nombre magique dans les scripts, etc. J'ai une aversion générale à la magie des nombres.)
- juste pour se souvenir de la valeur de hachage 😉 utiliser SHA1("l'arbre 0\0") = 4b825dc642cb6eb9a060e54bf8d69288fbee4904 (\0 est NUL personnage)
- le
git hash-object -t tree /dev/null
méthode (à partir de VonC la réponse ci-dessous) a l'avantage de ne pas coder en dur SHA-1, dans le cas ou une future version de git commutateurs à SHA-2, par exemple. (Je ne vais pas tenter de prédire quand cela pourrait se produire. 🙂 Il serait plus facile de passer Mercurial SHA-2, depuis qu'ils ont quitté la place.) - de la cause, vous avez raison, mais c'est un bon morceau de "la Connaissance Inutile" et qu'elle est utile en tout cas pour quelqu'un d'autre?!
- ressemble à l'algorithme de hachage de basculement peut se produire plus tôt que prévu. 🙂
- En parlant de "l'avenir de la version de Git", je pense que vous serez intéressé dans mon dernier (Déc. 2017) modifier pour mon 2012 réponse: stackoverflow.com/revisions/9766506/7
Vous devez vous connecter pour publier un commentaire.
Ce fil mentionne:
Ou, comme Ciro Santilli propose dans les commentaires:
Ou, comme vu 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 vide sha1 de l'arbre (au lieu de dépendre d'un "bien connu de la valeur").
Remarque, vous verrez que SHA1 pop-up sur certains dépôt GitHub quand l'auteur veut d'abord s'engager à être vide (voir le post de blog "Comment j'initialise mon dépôts Git"):
Vous donnera:
(Voir l'arbre SHA1?)
Vous pouvez même rebase votre histoire sur le dessus de ce vide s'engager (voir "git: comment insérer un commit comme la première, fait passer tous les autres?")
Dans les deux cas, vous ne comptez pas sur l'exacte valeur SHA1 de l'arbre vide.
Il vous suffit de suivre un les meilleures pratiques, l'initialisation de votre pension avec un premier vide commettre.
À faire:
Qui permettra de générer un commit avec un SHA1 spécifiques à votre repo, nom d'utilisateur, e-mail, date de la création (ce qui signifie le SHA1 de la livraison lui-même sera différent à chaque fois).
Mais l'arbre référencé par ce commit sera
4b825dc642cb6eb9a060e54bf8d69288fbee4904
, l'arbre vide SHA1.À afficher l'arborescence d'un commit (affichage de la validation de l'arbre SHA1):
Si ce commit, le référencement d'un arbre vide, est en effet votre première engager, vous pouvez montrer que l'arbre vide SHA1 avec:
(et qui fonctionne même sur Windows, avec Gnu Sous Windows commandes)
Comme commenté ci-dessous, à l'aide de
git diff <valider> HEAD
, cela permettra de montrer à tous vos fichiers dans le CHEF de la direction générale:Note: arbre vide valeur est officiellement défini dans
cache.h
.Depuis Git 2.16 (T1 2018), il est utilisé dans une structure qui n'est plus liée à (seulement) SHA1, comme on le voit dans s'engager eb0ccfd:
Voir plus à "Pourquoi ne pas utiliser Git plus moderne SHA?": il est SHA-2, depuis Git 2.19 (T3 2018)
Avec Git 2.25 (T1 2020), les tests sont en préparation pour un SHA-2 transition, et impliquant l'arbre vide.
Voir s'engager fa26d5e, s'engager cf02be8, s'engager 38ee26b, s'engager 37ab8eb, s'engager 0370b35, s'engager 0253e12, s'engager 45e2ef2, s'engager 79b0edc, s'engager 840624f, s'engager 32a6707, s'engager 440bf91, s'engager 0b408ca, s'engager 2eabd38 (28 Oct 2019), et s'engager 1bcef51, s'engager ecde49b (05 Oct 2019) par brian m. carlson (
bk2204
).(Fusionnés par Junio C Hamano --
gitster
-- dans s'engager 28014c1, 10 Novembre 2019)Donc
t/oid-info/hash-info
comprend maintenant:La SHA2 "
6ef19b41225c5369f1c104d45d8d85efa9b057b53b14b4b9b939dd74decc5321
" est le nouveau SHA1 "4b825dc642cb6eb9a060e54bf8d69288fbee4904
" arbre vide.git diff-tree
dans certains scripts je suis en train d'écrire. Il n'y a aucune garantie qu'il y a un vide initial s'engager dans l'opération. Donc, je me demandais simplement si ces scripts peuvent finissent par rompre un jour.-w
àgit hash-object
, il va créer l'objet dans le référentiel il est dirigé contre l', et qui permettrait de recréer l'arbre vide dans le référentiel, vous êtes en cours d'exécution contre, s'il devait jamais aller aussi loin dans l'avenir./dev/null
:printf '' | git hash-object --stdin -t tree
🙂git mktree < /dev/null
. Les deuxgit hash-object
et cela donne le même résultat final.git diff --name-only 4b825dc642cb6eb9a060e54bf8d69288fbee4904
serait d'afficher la liste de tous les fichiers présents de l'onu, l'actuel CHEF de la direction générale.HEAD
commettre. Vous devezgit diff <options> <hash> HEAD
pour le second.J'ai écrit un billet de blog avec deux différentes façons de trouver le hash: http://colinschimmelfing.com/blog/gits-empty-tree/
Si elle devait jamais changer pour une raison quelconque, vous pouvez l'utiliser de deux manières ci-dessous pour trouver. Cependant, que je me sens assez confiant dans l'utilisation du hachage .bashrc alias, etc., et je ne pense pas qu'il va changer de sitôt. À tout le moins, il serait probablement une version majeure de git.
Les deux façons de faire sont:
git hash-object -t tree --stdin < /dev/null
git write-tree
dans ce nouveau repo - le hachage sera sortie par git écriture de l'arbre.–-stdin
me donnefatal: Cannot open '–-stdin': No such file or directory
avec git 2.7.2. Toutefois, l'exécution sans--stdin
comme dans VonC réponse que donne la valeur de hachageVoici la réponse sur la façon de créer arbre vide s'engager, 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 le "vide" à la balise, mais pas une branche. Moyen Simple est:
Parce que la balise peut pointer vers l'arbre-ish directement, sans commettre.
Maintenant, pour obtenir tous les fichiers dans l'arbre de travail:
Ou même avec stat:
Tous les fichiers que diff:
Case d'url dans tous les fichiers:
git rev-parse
aurait la création de nouveaux indicateurs ou de mots clés ou quelque chose le long de ces lignes, à produire (a) le vide de l'arbre de hachage et (b) la valeur null validation de hachage. Ces deux serait utile dans les scripts et les protéger contre le projet de SHA-256 changements.git read-tree
ne pas l'exporter n'importe où. Depuis la rev-parse est une sorte de l'entreprise de programmation de l'API pour hash Id, je pense que c'est là où ils appartiennent.