J'essaie de faire des trucs fantaisistes ici avec des hooks Git, mais je ne sais pas vraiment comment le faire (ou si c'est possible).
Ce que je dois faire est: dans chaque commit, je veux prendre son hachage puis mettre à jour un fichier dans le commit avec ce hachage.
Des idées?
Réponses:
Je recommanderais de faire quelque chose de similaire à ce que vous avez en tête: placer le SHA1 dans un fichier non suivi , généré dans le cadre du processus de construction / installation / déploiement. C'est évidemment facile à faire (
git rev-parse HEAD > filename
ou peut-êtregit describe [--tags] > filename
), et cela évite de faire quelque chose de fou comme se retrouver avec un fichier différent de ce que git traque.Votre code peut alors référencer ce fichier lorsqu'il a besoin du numéro de version, ou un processus de génération peut incorporer les informations dans le produit final. Ce dernier est en fait la façon dont git lui-même obtient ses numéros de version - le processus de construction saisit le numéro de version du dépôt, puis le construit dans l'exécutable.
la source
Il est impossible d'écrire le hachage de validation actuel: si vous parvenez à pré-calculer le hachage de validation futur, il changera dès que vous modifierez un fichier.
Cependant, il existe trois options:
pre-commit
, stockez le hachage de commit précédent :) Vous ne modifiez / n'insérez pas de commits dans 99,99% des cas, donc, cela fonctionnera. Dans le pire des cas, vous pouvez toujours identifier la révision source.Je travaille sur un script de hook, je le posterai ici `` quand c'est fait '', mais encore - avant la sortie de Duke Nukem Forever :))
Mise à jour : code pour
.git/hooks/pre-commit
:Maintenant, la seule chose dont nous avons besoin est un outil qui convertit la
prev_commit,branch
paire en un véritable hachage de validation :)Je ne sais pas si cette approche peut distinguer les commits de fusion. Je vais le vérifier bientôt
la source
Quelqu'un m'a indiqué la section "man gitattributes" sur ident, qui contient ceci:
ident
Si vous y réfléchissez, c'est ce que font aussi CVS, Subversion, etc. Si vous regardez le référentiel, vous verrez que le fichier dans le référentiel contient toujours, par exemple, $ Id $. Il ne contient jamais l'expansion de cela. Ce n'est qu'à la caisse que le texte est développé.
la source
ident
est le hachage du fichier lui-même, pas le hast du commit. De git-scm.com/book/en/… : "Cependant, ce résultat est d'une utilité limitée. Si vous avez utilisé la substitution de mots-clés dans CVS ou Subversion, vous pouvez inclure un horodatage - le SHA n'est pas très utile, car c'est assez aléatoire et vous ne pouvez pas dire si un SHA est plus ancien ou plus récent qu'un autre. "filter
prend du travail, mais il peut obtenir les informations de validation dans (et hors de) un fichier.Cela peut être réalisé en utilisant l'
filter
attribut dans gitattributes . Vous devez fournir unesmudge
commande qui insère l'ID de validation et uneclean
commande qui le supprime, de sorte que le fichier dans lequel il est inséré ne change pas simplement à cause de l'ID de validation.Ainsi, l'ID de validation n'est jamais stocké dans l'objet blob du fichier; il est simplement développé dans votre copie de travail. (En fait, l'insertion de l'identifiant de validation dans le blob deviendrait une tâche infiniment récursive. ☺) Quiconque clonerait cet arbre devrait configurer les attributs pour elle-même.
la source
Pensez en dehors de la boîte de validation!
placez-le dans le fichier hooks / post-checkout
La version sera disponible partout où vous l'utilisez.
la source
Je ne pense pas que vous vouliez réellement faire cela, car lorsqu'un fichier du commit est modifié, le hachage du commit est également modifié.
la source
Permettez-moi d'explorer pourquoi c'est un problème difficile en utilisant les internes de git. Vous pouvez obtenir le sha1 du commit actuel par
Essentiellement, vous exécutez une somme de contrôle sha1 sur le message renvoyé par
git cat-file commit HEAD
. Deux choses apparaissent immédiatement comme un problème lorsque vous examinez ce message. L'un est l'arbre sha1 et le second est l'heure de validation.Désormais, le temps de validation est facilement pris en charge en modifiant le message et en devinant combien de temps il faut pour effectuer une validation ou planifier une validation à un moment donné. Le vrai problème est l'arbre sha1, à partir duquel vous pouvez obtenir
git ls-tree $(git write-tree) | git mktree
. Essentiellement, vous faites une somme de contrôle sha1 sur le message de ls-tree, qui est une liste de tous les fichiers et leur somme de contrôle sha1.Par conséquent, votre somme de contrôle sha1 de validation dépend de la somme de contrôle sha1 de votre arbre, qui dépend directement de la somme de contrôle sha1 des fichiers, qui complète le cercle et dépend du commit sha1. Ainsi, vous avez un problème circulaire avec les techniques dont je dispose.
Avec des sommes de contrôle moins sécurisées , il s'est avéré possible d'écrire la somme de contrôle du fichier dans le fichier lui-même par force brute; cependant, je ne connais aucun travail qui ait accompli cette tâche avec sha1. Ce n'est pas impossible, mais presque impossible avec notre compréhension actuelle (mais qui sait peut-être que dans quelques années, ce sera insignifiant). Cependant, cela est encore plus difficile à utiliser par force brute puisque vous devez écrire la somme de contrôle (de validation) d'une somme de contrôle (d'arborescence) d'une somme de contrôle (blob) dans le fichier.
la source