Ne git avoir quelque chose comme "svn propset svn:keywords" ou pré-/post-commit crochets?

StackOverflow https://stackoverflow.com/questions/39742

  •  09-06-2019
  •  | 
  •  

Question

La navigation à travers le git de la documentation, je ne peux pas voir quelque chose d'analogue à SVN commit des crochets ou la "propset" fonctionnalités qui peuvent, dire, mise à jour d'un numéro de version ou avis de droit d'auteur à l'intérieur d'un fichier chaque fois qu'il est engagé dans le référentiel.

Sont git les utilisateurs devraient écrire des scripts externes pour ce genre de fonctionnalité (qui ne semble pas hors de question) ou ai-je raté quelque chose d'évident?

Modifier :Juste pour être clair, je suis plus intéressé, par exemple,

svn propset svn:keywords "Author Date Id Revision" expl3.dtx

lorsqu'une chaîne comme ceci:

$Id: expl3.dtx 780 2008-08-30 12:32:34Z morten $

elle est maintenue à jour avec les informations pertinentes à chaque fois qu'un commit se produit.

Était-ce utile?

La solution

Citant le Git FAQ:

Ne git ont l'expansion de mots clés?

Pas recommandé.Mot-clé de l'expansion provoque toutes sortes de problèmes étranges et n'est pas vraiment utile de toute façon, surtout dans le contexte d'une SCM.À l'extérieur git vous pouvez effectuer l'expansion de mots clés à l'aide d'un script.Le noyau Linux à l'exportation script pour définir la EXTRA_VERSION variable dans le fichier Makefile.

Voir gitattributes(5) si vous voulez vraiment le faire.Si votre traduction n'est pas réversible (par exemple les CLUSTERS à l'expansion de mots clés) cela peut être problématique.

Autres conseils

J'ai écrit un assez complet répondre d'ailleurs, avec le code montrant comment le faire.Un résumé:

  1. Vous ne voulez probablement pas à le faire.À l'aide de git describe est une solution de rechange raisonnable.
  2. Si vous avez besoin de le faire, $Id$ et $Format$ sont assez faciles.
  3. Quelque chose de plus avancé nécessite l'usage d' gitattributes et un filtre personnalisé.- Je fournir un exemple de mise en œuvre de $Date$.

Les Solutions basées sur des fonctions de raccordement ne sont généralement pas utiles, car ils font de votre copie de travail sale.

Git n'ont pre-commit et post-commit crochets, ils sont situés à l'intérieur de chacun .git/hooks répertoire.Juste modifier les fichiers et les chmod pour les rendre exécutable.

Peut-être le plus commun SVN propriété 'svn:ignore' est fait par le biais de l' .gitignore fichier, plutôt que de métadonnées.J'ai peur de ne pas avoir quelque chose de plus utile pour les autres types de métadonnées.

Bien que d'un âge ancien de Q&A.Je pensais lancer un puisque cela a été m'énerve pour un long moment.

Je suis utilisé pour afficher la liste des fichiers dans un répertoire par la commande en temps (c'est marrant comme moi, non?).La raison en est que je voudrais voir les fichiers que j'ai (ou quelqu'un d'autre a) a changé récemment.

Git mess mes plans car lors de la commutation d'une branche locale des pensions de complètement remplacer le suivi des fichiers à partir de l' (en incrémental...Je sais...) des copies qui sont assis dans les paniers locaux repo.

De cette façon, tous les fichiers qui ont été extraits de transporter de l'horodatage de la caisse et qui ne reflète pas leur date de dernière modification.....Comment donc ennuyeux.

Donc, j'ai conçu un one-liner en bash qui va mettre à jour un $Date:$ propriété à l'intérieur de n'importe quel fichier À L'HEURE DE LA DERNIÈRE MODIFICATION SELON CE QU'IL A SUR LE SYSTÈME DE FICHIERS tel que je vais avoir un statut immédiat dire de la dernière modification, sans avoir à parcourir l' git log , git show ou tout autre outil qui donne la commettre fois dans blâmer mode.

La procédure suivante vous permettra de modifier le $Date:$ mot clé uniquement dans le suivi des fichiers qui vont être engagés dans le repo.Il utilise git diff --name-only pour consulter la liste des fichiers qui ont été modifiés, et rien d'autre....

J'utilise ce one-liner manuellement avant de valider le code.Une chose cependant, c'est que j'ai pour naviguer vers le repo du répertoire racine avant d'appliquer cette.

Voici le code de la variante de Linux (collé comme un multi-ligne pour des raisons de lisibilité)

git diff --name-only | xargs stat -c "%n %Y" 2>/dev/null | \
perl -pe 's/[^[:ascii:]]//g;' | while read l; do \
   set -- $l; f=$1;  shift; d=$*; modif=`date -d "@$d"`; \
   perl -i.bak -pe 's/\$Date: [\w \d\/:,.)(+-]*\$/\$Date: '"$modif"'\$/i' $f; \
   git add $f; done

et OSX

git diff --name-only | xargs stat -f "%N %Sm" | while read l; do \
   set -- $l; f=$1; shift; d=$*; modif=`date -j -f "%b %d %T %Y" "$d"`; \
   perl -i.bak -pe 's/\$Date: [\w \d\/:,.)(+-]*\$/\$Date: '"$modif"'\$/i' $f; \
   git add $f; done
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top