145 votes

arbre vide semi-secret de git

Git est un 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 la 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 à l' git diff-tree, dont l'un des exemples de crochets.

Ce que je me demande,

  1. quelle est la fiabilité de ce-c'est à dire, certaines future version de git pas un git objet numéroté 4b825dc642cb6eb9a060e54bf8d69288fbee4904?
  2. 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.)

124voto

VonC Points 414372

Ce fil mentionne:

Si vous ne vous souvenez pas de l'arbre vide sha1, vous pouvez toujours tirer avec:

git hash-object -t tree /dev/null

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"):

$ GIT_AUTHOR_DATE="Thu, 01 Jan 1970 00:00:00 +0000" GIT_COMMITTER_DATE="Thu, 01 Jan 1970 00:00:00 +0000" git commit --allow-empty -m 'Initial commit'

Vous donnera:

Empty tree SHA1

(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 les meilleures pratiques, l'initialisation de votre pension avec un premier vide commettre.


Pour ce faire:

git init my_new_repo
cd my_new_repo
git config user.name username
git config user.email email@com

git commit --allow-empty -m "initial empty commit"

Que va 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.

git log --pretty=raw

commit 9ed4ff9ac204f20f826ddacc3f85ef7186d6cc14
tree 4b825dc642cb6eb9a060e54bf8d69288fbee4904      <====
author VonC <vonc@laposte.net> 1381232247 +0200
committer VonC <vonc@laposte.net> 1381232247 +0200

    initial empty commit

Pour montrer l'arbre d'un commit (affichage de la validation de l'arbre SHA1):

git show --pretty=format:%T 9ed4ff9ac204f20f826ddacc3f85ef7186d6cc14
4b825dc642cb6eb9a060e54bf8d69288fbee4904

Si ce commit, le référencement d'un arbre vide, est, en effet, votre premier commit, vous pouvez montrer que l'arbre vide SHA1 avec:

git log --pretty=format:%h --reverse | head -1 | xargs git show --pretty=format:%T
4b825dc642cb6eb9a060e54bf8d69288fbee4904

(et qui fonctionne même sur Windows, Gnu sous Windows commandes)

4voto

schimmy Points 90

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 c'était à jamais changer pour une raison quelconque, vous pouvez l'utiliser de deux manières ci-dessous pour trouver. Cependant, je me sens assez confiant à l'aide de la table de 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:

  1. La réponse ci-dessus: git hash-object -t tree --stdin < /dev/null
  2. Simplement initing un vide repo, puis en exécutant git write-tree dans ce nouveau repo - le hachage sera sortie par git écriture de l'arbre.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X