J'ai lu un tas de questions sur les outils de contrôle de code source simples et Git semblait être un choix raisonnable. Je l'ai opérationnel, et cela fonctionne bien jusqu'à présent. Un aspect que j'aime chez CVS est l'incrémentation automatique d'un numéro de version.
Je comprends que cela a moins de sens dans un référentiel distribué, mais en tant que développeur, je veux / ai besoin de quelque chose comme ça. Laissez-moi vous expliquer pourquoi:
J'utilise Emacs. Périodiquement, je passe en revue et cherche de nouvelles versions des fichiers source Lisp pour les paquets tiers. Disons que j'ai un fichier, foo.el, qui, selon l'en-tête, est la version 1.3; si je regarde la dernière version et vois que c'est 1.143 ou 2.6 ou autre, je sais que je suis assez loin derrière.
Si à la place je vois quelques hachages de 40 caractères, je ne saurai pas lequel est le plus tardif ou n'aurai aucune idée de combien de temps il est plus tard. Je détesterais absolument si je devais vérifier manuellement les ChangeLogs juste pour avoir une idée de mon dépassement.
En tant que développeur, je souhaite étendre cette courtoisie, telle que je la vois, aux personnes qui utilisent ma sortie (et peut-être que je me moque de moi, mais laissons cela de côté pendant un moment). Je ne veux pas avoir à me souvenir d'incrémenter moi-même ce foutu nombre à chaque fois, ou un horodatage ou quelque chose comme ça. C'est un vrai PITA, et je le sais par expérience.
Alors, quelles alternatives ai-je? Si je ne peux pas obtenir un équivalent $ Id: $, comment puis-je fournir ce que je recherche?
Je dois mentionner que je m'attends à ce que l'utilisateur final n'ait PAS installé Git et même s'il le fait, il n'aura pas de référentiel local (en effet, je m'attends à ne pas le rendre disponible de cette façon).
la source
filter-branch
ou quelque chose.git describe
commande juste avant de créer, enregistrer la sortie dans un fichier d'en-tête ou incorporer la valeur dans votre code.À présent, il existe un support pour $ Id: $ dans Git. Pour l'activer pour le fichier README, vous devez mettre "README ident" dans .gitattributes . Les caractères génériques sur les noms de fichiers sont pris en charge. Voir man gitattributes pour plus de détails.
la source
$Id$
mentionné. Ce qui est rangé est exactement ce que vous obtenez. Dans tous les cas, la version appartient à la collection complète des fichiers constituant un commit, pas à un fichier en particulier (cette idée est un vestige de l'époque RCS, ou peut-être que SCCS est à blâmer ici ... Comme CVS n'est qu'un glorifié frontend à RCS, et SVN essaie d'être un CVS-workalike, il est resté.).Ce n'est pas une demande déraisonnable de l'OP.
Mon cas d'utilisation est:
/usr/local/bin
quand ils sont prêts.J'utilise trois machines distinctes avec le même référentiel Git. Ce serait bien de savoir dans quelle "version" du fichier j'ai actuellement
/usr/local/bin
sans avoir à faire un manuel "diff -u <repo version> <version dans / usr / local / bin>".Pour ceux d'entre vous qui sont négatifs, rappelez-vous qu'il existe d'autres cas d'utilisation. Tout le monde n'utilise pas Git pour un travail collaboratif, les fichiers du référentiel Git étant leur emplacement «final».
Quoi qu'il en soit, la façon dont je l'ai fait a été de créer un fichier d'attributs dans le référentiel comme ceci:
Ensuite, mettez $ Id $ quelque part dans le fichier (j'aime le mettre après le shebang).
Le commit. Notez que cela ne fait pas automatiquement l'expansion comme je m'y attendais. Vous devez recopier le fichier, par exemple,
Et puis vous verrez l'extension, par exemple:
Vous trouverez de bonnes informations dans Comment activer la chaîne d'identification pour un référentiel Git? .
la source
git co
doit-on faire? J'ai reçu le message d'erreur "git: 'co' is not a git command. See 'git --help'.
" Doit- il l'êtregit checkout
?Je ne suis pas sûr que ce sera jamais dans Git. Pour citer Linus :
Cependant, il est assez facile de vérifier le journal - si vous suivez la branche stable de foo.el, vous pouvez voir quels nouveaux commits sont dans le journal de la branche stable qui ne sont pas dans votre copie locale. Si vous souhaitez simuler le numéro de version interne de CVS, vous pouvez comparer l'horodatage du dernier commit.
Edit: vous devez écrire ou utiliser les scripts de quelqu'un d'autre pour cela, bien sûr, ne pas le faire manuellement.
la source
$Id$
via l'ident
attribut, comme mentionné dans une autre réponse ici, montrant que même git lui-même n'est pas l'otage de l'opinion de Linus.Comme je l' ai écrit avant :
la source
J'ai eu le même problème. J'avais besoin d'une version plus simple qu'une chaîne de hachage et disponible pour les personnes utilisant l'outil sans avoir besoin de se connecter au référentiel.
Je l'ai fait avec un hook de pré-commit Git et j'ai changé mon script pour pouvoir se mettre à jour automatiquement.
Je base la version sur le nombre de commits effectués. Il s'agit d'une légère condition de concurrence car deux personnes pourraient s'engager en même temps et toutes les deux pensent qu'elles commettent le même numéro de version, mais nous n'avons pas beaucoup de développeurs sur ce projet.
À titre d'exemple, j'ai un script que j'archive qui est en Ruby, et j'y ajoute ce code - c'est un code assez simple, il est donc facile de porter vers différentes langues si vous enregistrez quelque chose dans une langue différente (bien que évidemment cela ne fonctionnera pas facilement avec des archivages non exécutables tels que des fichiers texte). J'ai ajouté:
Et puis j'ajoute une option de ligne de commande (-updateVersion) au script donc si je l'appelle comme "tool -updateVersion" alors il appelle juste updateVersion pour l'outil qui modifie la valeur "MYVERSION" en lui-même et puis quitte (vous pouvez faites-le également mettre à jour d'autres fichiers s'ils sont également ouverts si vous le souhaitez).
Une fois que c'est configuré, je vais à la tête de Git et crée un script bash exécutable sur une ligne dans
.git/hooks/pre-commit
.Le script change simplement en tête du répertoire Git et appelle mon script avec
-updateVersion
.Chaque fois que j'enregistre le script de pré-validation est exécuté qui exécute mon script avec -updateVersion, puis la variable MYVERSION est mise à jour en fonction du nombre de validations. La magie!
la source
git updateVersion
? Veuillez mettre quelques exemples de son nom.Si avoir $ Keywords $ est essentiel pour vous, alors peut-être pourriez-vous essayer de regarder Mercurial à la place? Il a une extension hgkeyword qui implémente ce que vous voulez. Mercurial est de toute façon intéressant en tant que DVCS.
la source
Une chose qui est faite avec les référentiels Git est d'utiliser l'
tag
objet. Cela peut être utilisé pour marquer un commit avec n'importe quel type de chaîne et peut être utilisé pour marquer des versions. Vous pouvez voir que les balises dans un référentiel avec legit tag
commande, qui renvoie toutes les balises.Il est facile de vérifier une balise. Par exemple, s'il existe une balise,
v1.1
vous pouvez récupérer cette balise dans une branche comme celle-ci:Comme il s'agit d'un objet de premier niveau, vous verrez tout l'historique de cette validation, ainsi que vous pourrez exécuter des différences, apporter des modifications et des fusions.
Non seulement cela, mais une balise persiste, même si la branche sur laquelle elle se trouvait a été supprimée sans être fusionnée dans la ligne principale.
la source
export-subst
fonctionnalité degitattributes(5)
. Cela nécessite bien sûr l'utilisation degit archive
pour créer des versions, et les modifications de substitution ne seront visibles que dans le fichier tar résultant.Si je comprends bien, vous voulez essentiellement savoir combien de commits se sont produits sur un fichier donné depuis la dernière mise à jour.
Commencez par récupérer les modifications dans l'origine distante, mais ne les fusionnez pas dans votre
master
branche:Ensuite, obtenez un journal des changements qui se sont produits sur un fichier donné entre votre
master
succursale et la télécommandeorigin/master
.Cela vous donne les messages de journal de toutes les validations qui se sont produites dans le référentiel distant depuis votre dernière fusion
origin/master
dans votremaster
.Si vous voulez juste un décompte des modifications, dirigez-le vers
wc
. Dis, comme ceci:la source
Si vous voulez simplement que les gens puissent avoir une idée de leur dépassement, Git peut les informer de plusieurs manières assez simples. Ils comparent les dates du dernier commit sur leur coffre et votre coffre, par exemple. Ils peuvent utiliser
git cherry
pour voir combien de commits se sont produits dans votre coffre qui ne sont pas présents dans le leur.Si c'est tout ce que vous voulez, je chercherais un moyen de le fournir sans numéro de version.
De plus, je ne prendrais pas la peine d'étendre la courtoisie à qui que ce soit à moins que vous ne soyez sûr qu'il le souhaite. :)
la source
Pour appliquer l'expansion à tous les fichiers de tous les sous-répertoires du référentiel, ajoutez un
.gitattributes
fichier au répertoire de niveau supérieur du référentiel (c'est-à-dire où vous placez normalement le.gitignore
fichier) contenant:Pour voir cela en vigueur, vous devez d'abord effectuer une extraction efficace du ou des fichiers, par exemple en les supprimant ou en les modifiant de quelque manière que ce soit. Puis restaurez-les avec:
Et vous devriez voir
$Id$
remplacé par quelque chose comme:De
man gitattributes
:Cet ID changera chaque fois qu'une nouvelle version du fichier est validée.
la source
Les ID RCS sont bien pour les projets à un seul fichier, mais pour tous les autres, $ Id $ ne dit rien sur le projet (sauf si vous effectuez des vérifications forcées dans un fichier de version factice).
On pourrait néanmoins être intéressé par la façon d'obtenir les équivalents de $ Author $, $ Date $, $ Revision $, $ RCSfile $, etc. au niveau par fichier ou au niveau de la validation (comment les mettre là où se trouvent certains mots-clés en est une autre question). Je n'ai pas de réponse à ce sujet, mais je vois la nécessité de les mettre à jour, en particulier lorsque les fichiers (maintenant dans Git) proviennent de systèmes compatibles RCS (CVS).
De tels mots-clés peuvent être intéressants si les sources sont distribuées séparément de tout dépôt Git (c'est ce que je fais aussi). Ma solution est comme ceci:
Chaque projet a son propre répertoire et à la racine du projet, j'ai un fichier texte nommé
.version
dont le contenu décrit la version actuelle (le nom qui sera utilisé lors de l'exportation des sources).Tout en travaillant pour la prochaine version, un script extrait ce
.version
numéro, un descripteur de version Git (commegit describe
) et un numéro de build monotone dans.build
(plus l'hôte et la date) dans un fichier source généré automatiquement qui est lié au programme final, afin que vous puissiez trouver de quelle source et quand il a été construit.Je développe de nouvelles fonctionnalités dans des branches séparées, et la première chose que je fais est d'ajouter
n
(pour "next") à la.version
chaîne (plusieurs branches provenant de la même racine utiliseraient le même.version
numéro temporaire ). Avant la sortie, je décide quelles branches fusionner (j'espère qu'elles ont toutes les mêmes.version
). Avant de valider la fusion, je mets à jour.version
le numéro suivant ( mise à jour majeure ou mineure, selon les fonctionnalités fusionnées).la source
Si vous voulez que les informations git commit soient accessibles dans votre code, vous devez effectuer une étape de pré-construction pour y parvenir. Dans bash pour C / C ++, cela pourrait ressembler à ceci:
prebuild.sh
avec
version.h
ressemblant à:Ensuite, partout où vous en avez besoin dans votre code
#include "version.h"
et référencegit_tag
ougit_commit
selon vos besoins.Et vous
Makefile
pourriez avoir quelque chose comme ça:Cela a l'avantage de:
Cette implémentation de
prepublish.sh
présente les inconvénients de:git_tag
/git_commit
n'a pas changé.git describe --tags --always --dirty
pour attraper ce cas d'utilisation.Un amateur
prebuild.sh
qui pourrait éviter ces problèmes est laissé comme exercice pour le lecteur.la source
Je suis d'accord avec ceux qui pensent que le remplacement des jetons appartient aux outils de construction plutôt qu'aux outils de contrôle de version.
Vous devriez avoir un outil de publication automatisé pour définir les ID de version dans vos sources au moment où la publication est balisée.
la source
Les noms de balises et autres informations associées peuvent désormais être édités directement dans des fichiers automatiquement par Git grâce à la
export-subst
fonctionnalité degitattributes(5)
. Cela nécessite bien sûr l'utilisation degit archive
pour créer des versions, et les modifications de substitution ne seront visibles que dans le fichier tar résultant.Par exemple, dans le
.gitattributes
fichier, mettez la ligne suivante:Ensuite, dans les fichiers source, vous pouvez ajouter une ligne comme celle-ci:
Et il se développera pour ressembler à ceci dans une version créée par, par exemple
git archive v1.2.0.90
,:la source
Puisque vous utilisez Emacs, vous pourriez avoir de la chance :)
Je suis tombé sur cette question par coïncidence, et aussi par coïncidence, je suis tombé sur Lively il y a quelques jours, un paquet Emacs qui permet d'avoir des morceaux vivants d'Emacs Lisp dans votre document. Je n'ai pas essayé pour être honnête, mais cela m'est venu à l'esprit en lisant ceci.
la source
Je suis également venu de SCCS, RCS et CVS (
%W% %G% %U%
).J'ai eu un défi similaire. Je voulais savoir quelle version était un morceau de code sur n'importe quel système qui l'exécutait. Le système peut ou non être connecté à un réseau. Le système peut avoir installé ou non Git. Le système peut ou non avoir le référentiel GitHub installé dessus.
Je voulais la même solution pour plusieurs types de code (.sh, .go, .yml, .xml, etc.). Je voulais que toute personne sans connaissance de Git ou GitHub puisse répondre à la question "Quelle version utilisez-vous?"
Donc, j'ai écrit ce que j'appelle un wrapper autour de quelques commandes Git. Je l'utilise pour marquer un fichier avec un numéro de version et quelques informations. Cela résout mon défi. Cela peut vous aider.
https://github.com/BradleyA/markit
la source
Pour résoudre ce problème par moi-même, j'ai créé un petit "hack" comme hook post-commit:
Plus en détail documenté dans ce post sur mon blog .
la source