Le déplacement du dépôt CVS, Git: $Id:$ équivalent?
J'ai lu un tas de questions se posent à propos de simple code source des outils de contrôle et Git semblait être un choix raisonnable. Je l'ai et en cours d'exécution, et il fonctionne bien pour l'instant. L'un des aspects que j'aime à propos de CVS est l'incrémentation automatique du numéro de version.
Je comprends que cela fait moins de sens dans une base distribuée, mais en tant que développeur, j'ai envie/besoin de quelque chose comme cela. Laissez-moi vous expliquer pourquoi:
J'utilise Emacs. Périodiquement je aller à travers et à chercher de nouvelles versions de la Lisp des fichiers source pour les paquets de tierce partie. Dire 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 de voir que c'est 1.143, ou 2,6 ou que ce soit, je sais que je suis assez loin derrière.
Si, au contraire, je vois un couple de 40 caractères de la cendre, je ne sais pas qui est plus tard ou d'obtenir une idée de combien de temps il est. Je voudrais absolument détester si je devais vérifier manuellement les ChangeLogs juste pour avoir une idée de comment sortir de la date à laquelle je suis.
En tant que développeur, je veux prolonger cette courtoisie, comme je le vois, pour les personnes qui utilisent ma sortie (et peut-être que je suis moquez de moi-même que tout le monde est, mais laissons cela de côté pour un moment). Je ne veux pas avoir à me souvenir de incrémenter le numéro putain moi à chaque fois, ou un timestamp ou quelque chose comme ça. C'est un véritable pain PITA, et je sais qu'à partir de l'expérience.
Donc quelles alternatives s'offrent à moi? Si je ne peux pas obtenir un $Id:$ équivalent, sinon comment puis-je fournir à ce que je cherche?
Je tiens à préciser que mon attente est que l'utilisateur final n'aura PAS Git installé et même s'ils le font, n'aura pas un référentiel local (en effet, je m'attends pas à le rendre disponible de cette façon).
Vous devez vous connecter pour publier un commentaire.
Le SHA est juste une représentation d'une version (quoique canonique). Le
git describe
commande offre autres et le fait assez bien.Par exemple, quand je lance
git describe
dans ma branche master de mon Java client memcached source, j'obtiens ceci:Qui dit deux choses importantes:
Disons, par exemple, vous a préparé une
version
fichier avec la source (ou même réécrit tout le contenu à des fins de distribution) pour montrer que nombre. Disons que la version de paquet a été2.2-12-g6c4ae7a
(pas une libération, mais une version valide).Vous pouvez maintenant voir exactement comment loin derrière vous (4 livraisons), et, vous pouvez voir exactement ce qui 4 s'engage à:
filter-branch
ou quelque chose.git describe
commande juste avant de créer, enregistrer la sortie dans un fichier d'en-tête, ou autrement intégrer la valeur dans votre code.Maintenant, il ya un soutien pour $Id:$ dans Git. Afin de l'activer pour fichier README vous mettriez "README ident" dans .gitattributes. Les caractères génériques sur les noms de fichier sont pris en charge. Voir l'homme gitattributes pour plus de détails.
$Id$
mentionné. Ce qui est stocké à l'écart est exactement ce que vous obtenez. En tout cas, la version appartient à la collection complète des fichiers d'un commit, non pas à un fichier en particulier (Cette idée est un vestige de l'RCS jours, ou peut-être SCC est à blâmer ici... Comme CVS est juste une simple interface de RCS, et SVN essaie d'être un CVS-workalike, c'est resté.).Ce n'est pas déraisonnable de demander de l'OP.
Mon cas d'utilisation est:
/usr/local/bin
quand ils sont prêts.J'utilise trois machines avec le même dépôt Git sur elle. Il serait bon de savoir quelle "version" du fichier que j'ai actuellement dans
/usr/local/bin
sans avoir à faire un manuel de "diff -u <repo version> <version dans /usr/local/bin>".À ceux qui sont négatifs, rappelez-vous il y a d'autres cas d'utilisation d'y être. Pas tout le monde utilise Git pour le travail de collaboration avec les fichiers dans le dépôt Git de leur "finale" de l'emplacement.
De toute façon, comme je l'ai fait c'était pour créer un des attributs de fichier dans le référentiel comme ceci:
Puis mettre $Id$ quelque part dans le fichier (je tiens à le mettre après le shebang).
Le commettre. Notez que cela ne le fait pas automatiquement l'extension comme je l'ai prévu. Vous devrez re-co le fichier, par exemple,
Et puis vous verrez l'extension, par exemple:
De l'information de qualité est en Comment puis-je activer la chaîne ident pour un dépôt Git?.
git co
censé faire? J'ai eu le message d'erreur "git: 'co' is not a git command. See 'git --help'.
" Devrait ilgit checkout
?Pas sûr que ce ne sera jamais dans Git. Pour citation de Linus:
Il est assez facile de vérifier le journal, - si vous êtes suivi des foo.el est la branche stable, vous pouvez voir quels sont les nouveaux commits sont dans la branche stable du journal qui ne sont pas dans votre copie locale. Si vous voulez simuler CVS interne de numéro de version, vous pouvez comparer le timestamp de la dernière validation.
Edit: vous devez écrire ou d'utiliser de quelqu'un d'autre scripts pour cela, bien sûr, de ne pas le faire manuellement.
$Id$
via leident
attribut, tel que mentionné dans une autre réponse ici, en montrant que même git lui-même n'est pas l'otage de Linus son opinion.Comme je l'ai écrit avant:
J'ai eu le même problème. J'avais besoin d'avoir une version qui a été plus simple que d'une chaîne de hash et disponibles pour les personnes à l'aide de l'outil sans avoir à vous connecter au référentiel.
Je l'ai fait avec un Git pre-commit hook et modifié mon script pour être en mesure de se mettre automatiquement à jour.
J'base de la version off du nombre de validations effectuées. C'est une légère condition de course parce que deux personnes pouvaient s'engager dans le même temps et les deux pensent qu'ils sont en train de commettre le même numéro de version, mais nous n'avons pas beaucoup de développeurs sur ce projet.
Le mien est en Ruby, mais il n'est pas très complexe de code. Le script Ruby a:
Et puis j'ai une option de ligne de commande (-updateVersion) qui appelle updateVersion de l'outil.
Enfin, je vais à la Git de la tête et de créer un script exécutable dans
.git/hooks/pre-commit
.Le script de simples changements à la tête du répertoire Git et appelle mon script avec
-updateVersion
.À chaque fois que je l'enregistrement, la MYVERSION variable est mise à jour basé sur ce que le nombre de validations seront.
git updateVersion
? S'il vous plaît mettez quelques exemples de la façon dont elle est appelée.Si $Keywords$ est essentiel pour vous, alors peut-être que vous pourriez essayer de regarder Mercurial à la place? Il a un hgkeyword extension qui mettent en œuvre ce que vous voulez. Mercurial est intéressant comme un DVCS de toute façon.
Quelque chose qui est fait avec des dépôts Git est d'utiliser le
tag
objet. Cela peut être utilisé pour marquer un commit avec tout type de chaîne et peut être utilisé pour marquer les 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, si il y a une balise
v1.1
vous pouvez vérifier que la balise à une branche comme ceci:Que c'est un objet de niveau, vous pourrez voir toute l'histoire qui s'engagent, ainsi que d'être en mesure d'exécuter des diffs, faire des changements, et les fusions.
Non seulement cela, mais une balise persiste, même si la branche sur laquelle elle était sur a été supprimé sans être fusionnée dans la ligne principale.
Si vous avez juste envie de les gens à être en mesure d'obtenir une idée de comment loin de la date à laquelle ils sont, Git peut les informer de ce que dans plusieurs assez facile manières. Ils comparent les dates du dernier commit sur le tronc et le coffre de votre véhicule, par exemple. Ils peuvent utiliser
git cherry
pour voir combien de livraisons ont eu lieu dans votre coffre qui ne sont pas présents dans leur.Si c'est tout ce que vous voulez pour ce, j'aimerais trouver un moyen pour fournir sans numéro de version.
Aussi, je n'aurais pas pris la peine d'étendre la courtoisie de personne, sauf si vous êtes sûr qu'ils le veulent. 🙂
Si je comprends bien, essentiellement, vous voulez savoir combien de livraisons se sont produites sur un fichier depuis la dernière mise à jour.
De la première à obtenir les changements dans la télécommande d'origine, mais ne pas les fusionner dans votre
master
branche:Puis obtenir un journal des modifications qui se sont produites sur un fichier entre votre
master
direction et la distanceorigin/master
.Cela vous donne le journal des messages de tous les changements qui ont eu lieu dans le dépôt distant depuis votre dernière fusionné
origin/master
dans votremaster
.Si vous voulez un nombre de changements, la pipe à
wc
. Dire, comme ceci:RCS Id sont sympa pour un seul fichier de projets, mais pour tous les autres le $Id$ ne dit rien sur le projet (à moins que vous ne contraint mannequin check-ins à un mannequin de fichier d'une version).
Encore l'un pourrait être intéressé comment faire pour obtenir l'équivalent de $Auteur,$, $Date,$, $Revision$, $RCSfile$, etc. fichier par fichier ou à la validation du niveau (comment les mettre où certains mots-clés sont, c'est une autre question). Je n'ai pas de réponse sur ces derniers, mais voir l'exigence de mise à jour, en particulier lorsque les fichiers (maintenant dans Git) à l'origine de RCS-systèmes compatibles (CVS).
Ces mots clés peut être intéressant si les sources sont distribués indépendamment 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 dans 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 d'un script extraits
.version
nombre, certains de version Git descripteur (commegit describe
) et une fonction monotone numéro de build dans.build
(en plus de l'hôte et de la date) pour une auto-généré fichier source qui est lié à la version finale du programme, de sorte que vous pouvez trouver à partir de quelle source et quand il a été construit.J'développer de nouvelles fonctionnalités dans les branches distinctes, et la première chose que je fais est d'ajouter
n
(pour "suivant") à la.version
chaîne (plusieurs branches provenant de la même racine utiliser le même temporaire.version
nombre). Avant la libération, j'ai décider quelles branches de fusion (on l'espère tous avoir la même.version
). Avant d'engager la fusion, je l'ai mise à jour.version
pour le prochain numéro (majeure ou mineure de mise à jour, selon les caractéristiques ont fusionné).Je suis d'accord avec ceux qui pensent que le remplacement des jetons appartient à construire des outils, plutôt que de version des outils de contrôle.
Vous devriez avoir quelques automatisé d'outil pour définir l'Id de la version de vos sources au moment de la libération est d'être étiquetés.
D'appliquer l'extension de tous les fichiers dans tous les sous-répertoires dans le référentiel, ajouter un
.gitattributes
fichier dans le répertoire de niveau supérieur dans le référentiel (c'est à dire l'endroit où vous auriez normalement mettre à la.gitignore
fichier) contenant:Pour le voir en effet, vous aurez besoin pour faire un bon contrôle du fichier(s) en premier lieu, telles que la suppression ou de la modification d'une quelconque manière. Puis les restaurer avec:
Et vous devriez voir
$Id$
remplacé par quelque chose comme:De
man gitattributes
:Ce code change à chaque fois qu'une nouvelle version du fichier est engagé.
Puisque vous utilisez Emacs, vous pourriez avoir de la chance 🙂
J'ai trouvé cette question par coïncidence, et aussi, par hasard, je suis venu par Animé il ya quelques jours, Emacs package qui permet d'avoir animé des morceaux de Emacs Lisp dans votre document. Je n'ai pas essayé d'être honnête, mais il est venu à mon esprit lors de la lecture de ce.
Je suis également venu de SCC, RCS, et CVS (
%W% %G% %U%
).J'ai eu un problème similaire. Je voulais savoir quelle est la version d'un morceau de code a été sur un système en cours d'exécution. Le système peut ou ne peut pas être connectée à un réseau. Le système peut ou peut ne pas avoir Git installé. Le système peut ou peut ne pas avoir le dépôt GitHub installé.
Je voulais la même solution pour plusieurs types de code (.sh, .aller, .yml, .xml, etc). Je voulais à toute personne sans connaissances de Git ou GitHub, pour être en mesure de répondre à la question "Quelle version utilisez-vous?"
Alors, 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 de l'information. Il résout mon défi. Il peut vous aider.
https://github.com/BradleyA/markit
Si vous voulez le git commit informations accessible dans votre code, vous ont de faire une pré-étape de génération pour l'obtenir il. En bash pour le C/C++, il pourrait ressembler à quelque chose comme ceci:
prebuild.sh
avec
version.h
à la recherche comme:Puis, quand vous en avez besoin dans votre code
#include "version.h"
et de référencegit_tag
ougit_commit
en tant que de besoin.Et votre
Makefile
pourrait avoir quelque chose comme ceci:Cela a l'avantage de:
indépendamment de la ramification, la fusion de cherry-picking et de la ces.
Cette mise en œuvre de
prepublish.sh
a les inconvénients de l':git_tag
/git_commit
n'a pas changé.git describe --tags --always --dirty
à attraper que de cas d'utilisation.Un amateur de
prebuild.sh
qui pourrait éviter ces problèmes est laissé comme exercice pour le lecteur.