177 votes

Dans Git, comment puis-je écrire le commit courant de hachage d'un fichier dans la même livraison

Je suis en train de faire une fantaisie ici avec Git crochets, mais je ne sais pas vraiment comment le faire (ou si c'est possible).

Ce que je dois faire est la suivante: dans chaque livraison, je veux profiter de son hachage et ensuite mettre à jour un fichier dans le commettre avec ce code de hachage.

Tout ideias?

106voto

Jefromi Points 127932

Je recommanderais de faire quelque chose de similaire à ce que vous avez à l'esprit: le fait de placer le SHA1 dans une sans traces fichier généré dans le cadre de la construction/installation/déploiement de processus. Il est évidemment facile à faire (git rev-parse HEAD > filename ou peut - git describe [--tags] > filename), et ça évite de faire quelque chose de fou comme de se retrouver avec un fichier qui est différent de ce qu'git de suivi.

Votre code peut ensuite faire référence à ce fichier quand il en a besoin le numéro de version, ou un processus de construction susceptible d'intégrer les informations dans le produit final. Ce dernier est en fait comment git lui-même obtient ses numéros de version - le processus de construction saisit le numéro de version de la mise en pension, puis construit dans l'exécutable.

27voto

kolypto Points 3161

Il est impossible d'écrire le commit courant de hachage: si vous parvenez à le pré-calcul de la future commettre hachage - il va changer dès que vous modifiez un fichier.

Cependant, il y a trois options:

  1. Utiliser un script pour incrémenter 'commit' id et inclure quelque part. Laid
  2. .gitignore le fichier que vous allez stocker le code de hachage dans. Pas très pratique
  3. En pre-commit, le magasin de la précédente livraison de hachage :) Vous n'avez pas à modifier/insérer, s'engage dans 99,99% des cas, donc, cela fonctionnera. Dans le pire des cas vous pouvez toujours identifier la source de la révision.

Je suis en train de travailler sur un script hook, le posterai ici quand c'est fait", mais encore plus tôt que Duke Nukem Forever est sorti :))

UPD: code .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) # http://stackoverflow.com/questions/1593051/#1593487
branch_name=${branch_name##refs/heads/}
branch_name=${branch_name:-HEAD} # 'HEAD' indicates detached HEAD situation

# Write it
echo -e "prev_commit='$commit_hash'\ndate='$commit_date'\nbranch='$branch'\n" > gitcommit.py

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

Je ne sais pas si cette approche peut dire la fusion s'engage à part. Check it out bientôt

13voto

Baron Schwartz Points 755

Quelqu'un m'a signalé "l'homme gitattributes la section" ident, qui a ceci:

ident

Lorsque l'attribut ident est de définir un chemin d'accès, git remplace $Id$ dans l'objet blob avec $Id:, suivie par la 40 caractères hexadécimaux de blob nom de l'objet, suivi par un signe dollar $ au moment de l'extraction. Toute séquence d'octets qui commence avec $Id: et se termine par ' $ ' dans le worktree fichier est remplacé par $Id$ lors de l'enregistrement.

Si vous pensez à ce sujet, c'est ce que CVS, Subversion, etc faire aussi bien. 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 l'expansion de l'. C'est seulement à la caisse que le texte est élargi.

13voto

legoscia Points 12766

Ceci peut être réalisé à l'aide de la filter d'attribut dans gitattributes. Vous aurez besoin de fournir un smudge commande qui insère la validation de l'id, et un clean commande qui supprime, tels que le fichier il est inséré dans n'irais pas changer juste parce que de la commettre id.

Ainsi, la validation de l'id n'est jamais stocké dans le blob du fichier, c'est juste élargi dans votre copie de travail. (En fait, l'insertion de la commettre id dans le blob de devenir infiniment récursive de la tâche. ) Quiconque clones de cet arbre serait nécessaire pour définir les attributs pour elle-même.

3voto

midtiby Points 3351

Je ne pense pas que vous voulez vraiment le faire, parce que quand un fichier dans le commit est modifié, la valeur de hachage de la livraison est également modifiée.

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