En Git, Comment puis-je écrire le hachage de propagation courant dans un fichier de la même propagation?

j'essaye de faire un truc de fantaisie ici avec des crochets de gitan, mais je ne sais pas vraiment comment le faire (ou si c'est possible).

ce que je dois faire est: dans chaque propagation je veux prendre son hachage et puis mettre à jour un fichier dans la propagation avec ce hachage.

des idées?

94
demandé sur Mrchief 2010-08-09 22:15:50

7 réponses

je recommande de faire quelque chose de similaire à ce que vous avez à l'esprit: placer le SHA1 dans un fichier Non tracké , 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-être git describe [--tags] > filename ), et cela évite de faire quoi que ce soit de fou comme finir avec un fichier qui est différent de ce que git track.

votre code peut alors faire référence à ce fichier quand il a besoin du numéro de version, ou d'un build le procédé pourrait incorporer l'information 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 dans le répertoire, puis le construit dans l'exécutable.

68
répondu Cascabel 2010-08-09 19:30:38

Quelqu'un m'a montré la section" man gitattributes "sur ident, qui a ceci:

ident

lorsque l'attribut ident est défini pour un chemin, git remplace $Id$ dans l'objet blob par $Id:, suivi de Nom de l'objet hexadécimal blob de 40 caractères, suivi du signe $ à la caisse. Toute séquence d'octets qui commence avec $Id: et se termine avec $ dans le fichier worktree est remplacé par $Id$ à l'arrivée.

si vous y pensez, C'est ce que CVS, Subversion, etc font aussi. 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. C'est seulement à la caisse que le texte est élargi.

12
répondu Baron Schwartz 2013-01-25 02:33:08

cela peut être obtenu en utilisant l'attribut filter dans gitattributes . Vous devez fournir une commande smudge qui insère l'id de propagation, et une commande clean qui la supprime, de sorte que le fichier dans lequel elle est insérée ne changera pas juste à cause de l'id de propagation.

ainsi, l'id de propagation n'est jamais stocké dans le blob du fichier; il est simplement étendu dans votre copie de travail. (En fait, l'insertion de l'ID de propagation dans le blob serait devenu une tâche infiniment récursive. Toute personne qui clone cet arbre aurait besoin de mettre en place les attributs pour elle-même.

9
répondu legoscia 2010-08-10 09:50:26

il est impossible d'écrire le hash de propagation actuel: si vous parvenez à pré-calculer le hash de propagation futur - il changera dès que vous modifiez n'importe quel dossier.

cependant, il y a trois options:

  1. utilisez un script pour incrémenter 'commit id' et l'inclure quelque part. Moche
  2. .gitignore le fichier dans lequel vous allez stocker le hash. Pas très pratique
  3. Dans pre-commit , magasin de la commit hash précédent :) vous ne modifiez pas / insérez des commits dans 99,99% des cas, donc cela va marcher. Dans le pire des cas, vous pouvez encore identifier la révision source.

je travaille sur un script hook, le posterai ici quand c'est fait", mais encore plus tôt que Duke Nukem Forever est sorti :))

UPD : code pour .git/hooks/pre-commit :

#!/usr/bin/env bash
set -e

#=== 'prev-commit' solution by o_O Tync
#commit_hash=$(git rev-parse --verify HEAD)
commit=$(git log -1 --pretty="%H%n%ci") # hash \n date
commit_hash=$(echo "$commit" | head -1)
commit_date=$(echo "$commit" | head -2 | tail -1) # 2010-12-28 05:16:23 +0300

branch_name=$(git symbolic-ref -q HEAD) # /q/how-to-programmatically-determine-the-current-checked-out-git-branch-duplicate-52983/"prev_commit='$commit_hash'\ndate='$commit_date'\nbranch='$branch'\n" > gitcommit.py

Maintenant, la seule chose que nous besoin est un outil qui convertit prev_commit,branch paire à un réel commettre hachage :)

Je ne sais pas si cette approche peut dire que la fusion se divise. Check it out bientôt

9
répondu kolypto 2010-12-28 23:12:55

Je ne pense pas que vous vouliez vraiment faire cela, parce que quand un fichier dans la propagation est modifié, le hachage de la propagation est aussi modifié.

2
répondu midtiby 2010-08-09 18:30:05

Penser en dehors de la validation de la boîte!

insérez ceci dans le fichier hooks / post-checkout

#!/bin/sh
git describe --all --long > config/git-commit-version.txt

La version sera disponible partout vous l'utilisez.

2
répondu Keith Patrick 2018-01-18 16:58:59

permettez-moi d'explorer pourquoi il s'agit d'un problème difficile en utilisant les internes git. Vous pouvez obtenir le sha1 du commit actuel par

#!/bin/bash
commit=$(git cat-file commit HEAD) #
sha1=($((printf "commit %s"151900920"" $(echo "$commit" | wc -c); echo "$commit") | sha1sum))
echo ${sha1[0]}

essentiellement, vous exécutez une somme de contrôle sha1 sur le message retourné par git cat-file commit HEAD . Deux choses immédiatement sauter comme un problème lorsque vous examinez ce message. L'un est l'arbre sha1 et le second est le temps de propagation.

maintenant le temps de propagation est facilement pris en charge en modifiant le message et en devinant comment de temps il faut pour faire un commit ou de la planification à s'engager à un moment précis. Le vrai problème est l'arbre sha1, que vous pouvez obtenir de git ls-tree $(git write-tree) | git mktree . Essentiellement, vous faites un somme de contrôle sha1 sur le message de ls-arbre, qui est une liste de tous les fichiers et leur somme de contrôle sha1.

par conséquent votre somme de contrôle de sha1 de propagation dépend de votre somme de contrôle de sha1 d'arbre, qui dépend directement de la somme de contrôle de sha1 de fichiers, qui complète le cercle et dépend de la sha1 de propagation. Ainsi, vous avez un problème circulaire avec des techniques à ma disposition.

avec less secure checksums , il a été montré possible d'écrire la somme de contrôle du fichier dans le fichier lui-même par brute force; cependant, je ne sais pas de travail qui a accompli cette tâche avec sha1. Ce n'est pas impossible, mais impossible avec nos connaissances actuelles (mais qui sait peut-être que dans quelques années elle sera trivial). Cependant, c'est encore plus difficile à brutaliser force puisque vous devez écrire la somme de contrôle (commit) d'une somme de contrôle (tree) d'une somme de contrôle (blob) dans le fichier.

0
répondu Novice C 2017-09-29 00:37:42