10
votes

Le SHA-1 est-il calculé uniquement sur le contenu de l'arbre?

Pour l'amour d'une expérience, disons que votre git journal code> identifie les indications suivantes xxx pré>

après avoir commis, .git / refs / têtes / têtes / Master Code> Points à 16BC8486FB34CF9A6FAF0F7DF606AE72AD9A438. P>

Disons, après cela, je modifierai manuellement le fichier .git / refs / têtes / maître code> fichier à pointe sur 9188f9a25b045f130b088888bc3f638099fa7f212 p>

À ce stade, le statut GIT reconnaît qu'un nouveau fichier non engagé a besoin d'une attention particulière. C'est le même fichier mon deuxième titre pris en charge avant. P>

Si je vous engageez. Git Journal code> montre maintenant P>

commit b317f67686f9e6ab1eaabf47073b401d677205d5  // 2nd file committed for the 2nd time
commit 9188f9a25b045f130b08888bc3f638099fa7f212  // initial commit


1 commentaires

3 Réponses :


14
votes

Question 1: Parce que le hachage est généré en tenant compte de tout en tenant compte, y compris les métadonnées de validation (qui contient lui-même la date et l'heure).

Question 2: Journal GIT Affiche le journal de la branche actuelle. Le commit 16bc8486 ne fait pas partie de celui-ci. Autant que je sache (je ne suis pas totalement sûr), le collectionneur des ordures le retiendra tôt ou tard, s'il le trouve avec rien ne le référençant ( git gc --help ) ..


6 commentaires

Sur Q2, branche GIT montre une seule branche d'existence à ce stade - * Maître. Quelle branche est l'ancien fichier maintenant une partie de?


@Jam: Cela ne fait partie d'aucune branche, c'est pourquoi il est candidat à la collecte des ordures. Vous pouvez "sauver" en créant une branche explicitement sur ce commettre branche git branche_name commit_hash .


@Mat, si un peu de temps passé par et que le hachage n'est pas facilement disponible, est-il possible de le récupérer d'une manière ou d'une autre?


@JAM: Vous ne devriez pas m'attendre à ce que, une fois que le GC décide de nettoyer des choses, c'est loin. Si vous ne l'avez pas ailleurs ailleurs (une fourchette ou juste une copie des fichiers), c'est loin pour toujours. Si vous voulez le garder, créez une branche pointée vers elle et c'est ça. Ce n'est pas nécessaire, que vous poussez la branche quelque part, vous pouvez le garder local.


@Jam s'il n'a pas été déposé collecté, oui, vous pouvez utiliser git fsck --untréyable pour trouver tous ces engagements. Si cela a été recueilli, il est temps de tester vos sauvegardes :)


@Jam Git conserve les fichiers journaux de la manière dont les réfs ont changé au fil du temps - regardez la commande git reflog et git log -g -g . Le collecteur des ordures prend les fichiers journaux en compte - il ne prune pas des objets tant qu'ils sont référencés des fichiers journaux (mais les fichiers journaux eux-mêmes sont automatiquement élagés après une certaine quantité de temps)



2
votes

Le SHA1 est calculé à partir du diff et de toutes les métadonnées de ce commit (y compris l'auteur et le committerie, l'horodatage et diverses autres données).

Pour votre deuxième question, le commit des données est toujours présent mais ne fait plus partie d'une branche en direct. Parfois, Git dirigera une collection de déchets où diverses choses supprimées seront réellement supprimées. Vous remarquerez qu'une fois que vous l'exécutez manuellement en utilisant git gc que le commit non référencé sera parti et non même être accessible avec GIT SHOW.


0 commentaires

6
votes

Les valeurs SHA1 pour chacun des fichiers blobs seront identiques dans les deux cas si vous avez le même contenu (même si le nom de fichier est modifié).

De même que les valeurs SHA1 pour les arbres les arbres des fichiers blobs seront les mêmes si elles ont les mêmes noms de fichiers.

Cependant, au sommet du même sommet, nous avons le commettre qui contiendra le lien inchangé à la validation précédente, le top arborescence, l'auteur et la commière, mais comme le dit KingCrunch, l'auteur et la date de la commission Soyez Différent , de sorte que le SHA1 du COMTT SHA1 sera différent.

Vous pouvez les rendre identiques si vous définissez délibérément l'auteur et la date de commière à l'aide des variables d'environnement afin qu'elles soient inchangées.


1 commentaires

Corollaire supplémentaire; Si l'on leur rend identique, ils seront identiques aussi loin que le magasin d'objets et les graphiques de branche sont concernés. Ce sera comme si la division initiale, mais identique n'est jamais arrivée - elles sont indiscernables! Bonne chasse.