Nous utilisons SVN au travail, mais pour mes projets personnels, j'ai décidé d'utiliser Git. J'ai donc installé Git hier, et je me demande quel est le numéro de révision équivalent dans Git .
Disons que nous travaillons sur la version 3.0.8 et chaque correction de bogue a son propre numéro de révision que nous pouvons utiliser lorsque nous parlons de cette correction de bogue. Donc, si je marque le code dans Git en 3.0.8, que puis-je utiliser comme numéro de révision ou un autre type d'identification plus détaillé? Je trouve que le hachage n'est pas si convivial pour les humains.
Réponses:
Bonne ou mauvaise nouvelle pour vous, ce hachage EST le numéro de révision. J'ai également eu des problèmes avec cela lorsque je suis passé de SVN à git.
Vous pouvez utiliser le «balisage» dans git pour baliser une certaine révision en tant que «version» pour une version spécifique, ce qui facilite la référence à cette révision. Consultez cet article de blog .
L'essentiel à comprendre est que git ne peut pas avoir de numéros de révision - pensez à la nature décentralisée. Si les utilisateurs A et B s'engagent tous les deux dans leurs référentiels locaux, comment git peut-il raisonnablement attribuer un numéro de révision séquentiel? A n'a aucune connaissance de B avant de pousser / tirer les changements de l'autre.
Une autre chose à regarder est la ramification simplifiée pour les branches de correction de bogues:
Commencez avec une version: 3.0.8. Ensuite, après cette version, procédez comme suit:
Cela va créer une branche pour les corrections de bugs. Commander la succursale:
Maintenant, apportez les modifications de correction de bogue que vous souhaitez.
Validez-les et revenez à la branche principale:
Tirez ensuite ces changements de l'autre branche:
De cette façon, vous avez une branche de correctif de bogue spécifique à la version distincte, mais vous tirez toujours les modifications du correctif de bogue dans votre tronc de développement principal.
la source
fixed in 547cc3e..c4b2eba
et que vous avez une autre révision, vous ne savez pas si votre code est censé contenir le correctif?! Les gits de git-central ont sûrement une solution à cela?!?!Avec Git moderne (1.8.3.4 dans mon cas) et sans utiliser de branches, vous pouvez faire:
la source
git rev-list --count --first-parent HEAD
git rev-list --count HEAD
fonction du moment où les dernières poussées et tirages ont été effectuées.--first-parent
répond-il à votre préoccupation? Je détesterais éviter une solution apparemment plus simple en raison d'un cas de bord rare s'il existe une solution de contournement tout aussi simple ou un moyen de le rendre plus robuste.--first-parent
aide. Tant qu'aucun rebasage n'est effectué et que la même branche est toujours utilisée pour faire des versions (et calculer ce numéro de version, bien sûr), je pense que cela pourrait être utilisé. Cependant, je ne suis toujours pas certain qu'il identifierait toujours de manière unique le commit dont la version est issue. Il y a tellement de choses qui peuvent mal tourner ici ... mais pour le moment je ne peux pas penser à quelque chose qui pourrait définitivement casser cela (étant donné mes déclarations ci-dessus "aussi longtemps que"). Lagit describe
méthode mentionnée dans une autre réponse est la voie à suivre. Créez une balise si vous voulez quelque chose de lisible par l'homme.La
git describe
commande crée un nom légèrement plus lisible par l'homme qui fait référence à une validation spécifique. Par exemple, à partir de la documentation:Tant que vous utilisez des balises judicieusement nommées pour baliser des versions particulières, cela peut être considéré à peu près comme un "numéro de révision" SVN.
la source
git
référentiel a déjà des balises; si ce n'est pas le cas, git describe échoue avec "fatal: aucun nom trouvé, ne peut rien décrire". - Débordement de pile ; ce qui signifie que vous devrez configurer vous-même les balises.git describe
vous ne voulez jamais échouer, utilisez l'git describe --always
option.git describe
peut -elle être utilisée pour trouver le commit source, d'une manière ou d'une autre? À moins de compter manuellement les commits dans le journal, je veux dire.v1.0.4
) et l'ID de validation le plus récent (2414721
) font déjà partie de la sortie git describe.Les autres affiches ont raison, il n'y a pas de "numéro de révision".
Je pense que la meilleure façon est d'utiliser des balises pour les "versions"!
Mais j'ai utilisé les éléments suivants pour falsifier les numéros de révision (juste pour que les clients voient les révisions et les progrès, car ils voulaient avoir les mêmes révisions croissantes de git que lorsqu'elles étaient utilisées par subversion).
Afficher la "révision actuelle" de "HEAD" est simulée en utilisant ceci:
git rev-list HEAD | wc -l
Mais que faire si le client me dit qu'il y a un bug dans la "révision" 1302?
Pour cela, j'ai ajouté ce qui suit à la section [alias] de mon ~ / .gitconfig:
show-rev-number = !sh -c 'git rev-list --reverse HEAD | nl | awk \"{ if(\\$1 == "$0") { print \\$2 }}\"'
utilisant
git show-rev-number 1302
affichera alors le hachage pour la "révision" :)J'ai fait un article de blog (en allemand) sur cette "technique" il y a quelque temps.
la source
git bisect
(lien) est l'outil approprié pour identifier ce qui a changé quand et par qui.git rev-list --reverse HEAD | awk "{ print NR }" | tail -n 1
Git n'a pas le même concept de numéros de révision que subversion. Au lieu de cela, chaque instantané donné effectué avec une validation est marqué par une somme de contrôle SHA1. Pourquoi? Il y a plusieurs problèmes avec un revno en cours d'exécution dans un système de contrôle de version distribué:
Premièrement, comme le développement n'est pas linéaire du tout, l'attachement d'un nombre est plutôt difficile à résoudre d'une manière qui satisfera votre besoin en tant que programmeur. Essayer de résoudre ce problème en ajoutant un numéro peut rapidement devenir problématique lorsque le numéro ne se comporte pas comme prévu.
Deuxièmement, des numéros de révision peuvent être générés sur différentes machines. Cela rend la synchronisation des nombres beaucoup plus difficile - d'autant plus que la connectivité est unidirectionnelle; il se peut que vous n'ayez même pas accès à toutes les machines disposant du référentiel.
Troisièmement, dans git, quelque peu pionnier du système OpenCM aujourd'hui disparu, l' identité d'un commit (ce qu'est le commit) est équivalente à son nom (l'ID SHA). Ce concept de dénomination = identité est très fort. Lorsque vous vous asseyez avec un nom de validation à la main, il identifie également la validation d'une manière infalsifiable. À son tour, cela vous permet de vérifier toutes vos validations dans le premier initial pour la corruption avec la
git fsck
commande.Maintenant, comme nous avons un DAG (Directed Acyclic Graph) de révisions et que celles-ci constituent l'arborescence actuelle, nous avons besoin de quelques outils pour résoudre votre problème: Comment pouvons-nous distinguer les différentes versions. Tout d'abord, vous pouvez omettre une partie du hachage si un préfixe donné, par exemple 1516bd , identifie de manière unique votre commit. Mais c'est aussi assez artificiel. Au lieu de cela, l'astuce consiste à utiliser des balises et ou des branches. Une balise ou une branche s'apparente à une "note jaune" que vous attachez à un ID SHA1 de validation donné. Les balises sont, par essence, censées être immobiles alors qu'une branche se déplacera lorsque de nouveaux commits seront effectués sur sa HEAD. Il existe des moyens de faire référence à un commit autour d'une balise ou d'une branche, voir la page de manuel de git-rev-parse.
Habituellement, si vous devez travailler sur un morceau de code spécifique, ce morceau subit des modifications et devrait en tant que tel être une branche avec un nom de sujet disant. Créer beaucoup de branches (20-30 par programmeur n'est pas inconnu, avec environ 4-5 publiés pour que d'autres travaillent) est l'astuce pour un git efficace. Chaque travail doit commencer comme sa propre branche, puis être fusionné lorsqu'il est testé. Les branches non publiées peuvent être entièrement réécrites et cette partie de la destruction de l'histoire est une force de git.
Lorsque le changement est accepté en maître, il se fige quelque peu et devient archéologie. À ce stade, vous pouvez le marquer, mais le plus souvent, une référence au commit particulier est faite dans un suivi des bogues ou un suivi des problèmes via la somme sha1. Les balises sont généralement réservées aux sauts de version et aux points de branche pour les branches de maintenance (pour les anciennes versions).
la source
Si vous êtes intéressé, j'ai géré les numéros de version automatiquement depuis git infos ici sous le format
où build est le nombre total de validations. Vous verrez le code intéressant dans le
Makefile
. Voici la partie pertinente pour accéder aux différentes parties du numéro de version:la source
Une fonction Bash:
sort quelque chose comme
C'est
la source
Le hachage SHA1 de la validation est l'équivalent d'un numéro de révision Subversion.
la source
C'est ce que j'ai fait dans mon makefile basé sur d'autres solutions. Remarque non seulement cela donne à votre code un numéro de révision, mais il ajoute également le hachage qui vous permet de recréer la version.
la source
git-describe
pour éviter les erreurs soit celui avecgit describe --always --dirty --long --tags
lequel je travaille dans tous les cas.Le problème avec l'utilisation du hachage git comme numéro de build est qu'il n'augmente pas de façon monotone. OSGi suggère d'utiliser un horodatage pour le numéro de build. Il semble que le nombre de validations dans la branche puisse être utilisé à la place du numéro de subversion ou de changement forcé.
la source
J'ai écrit quelques utilitaires PowerShell pour récupérer les informations de version de Git et simplifier le balisage
fonctions: Get-LastVersion, Get-Revision, Get-NextMajorVersion, Get-NextMinorVersion, TagNextMajorVersion, TagNextMinorVersion:
la source
Chaque commit a un hachage unique. En dehors de cela, il n'y a pas de numéros de révision dans git. Vous devrez marquer vous-même les commits si vous voulez plus de convivialité.
la source
Je voudrais juste noter une autre approche possible - et c'est en utilisant
git
git-notes (1) , existant depuis la v 1.6.6 ( Note to Self - Git ) (j'utilise lagit
version 1.7.9.5).Fondamentalement, j'avais l'habitude
git svn
de cloner un référentiel SVN avec un historique linéaire (pas de disposition standard, pas de branches, pas de balises), et je voulais comparer les numéros de révision dans legit
référentiel cloné . Ce clone git n'a pas de balises par défaut, donc je ne peux pas l'utilisergit describe
. La stratégie ici ne fonctionnerait probablement que pour l'histoire linéaire - je ne sais pas comment cela se passerait avec les fusions, etc .; mais voici la stratégie de base:git rev-list
liste de tous les historiques de commitrev-list
est par défaut dans "l'ordre chronologique inverse", nous utiliserions son--reverse
commutateur pour obtenir la liste des validations triées par les plus anciennes en premierbash
shell pourgit log
avec--notes
, qui videra également une note de commit, qui dans ce cas serait le "numéro de révision"git status
)Tout d'abord, notons qu'il
git
a un emplacement par défaut des notes - mais vous pouvez également spécifier uneref
(érence) pour les notes - qui les stockerait dans un répertoire différent sous.git
; par exemple, dans ungit
dossier repo, vous pouvez appelergit notes get-ref
pour voir de quel répertoire il s'agit:La chose à noter est que si vous avez
notes add
un--ref
, vous devez également utiliser à nouveau cette référence - sinon vous pouvez obtenir des erreurs comme " Aucune note trouvée pour l'objet XXX ... ".Pour cet exemple, j'ai choisi d'appeler la
ref
note "linrev" (pour la révision linéaire) - cela signifie également qu'il est peu probable que la procédure interfère avec les notes déjà existantes. J'utilise également le--git-dir
commutateur, car étant ungit
débutant, j'ai eu quelques problèmes à le comprendre - je voudrais donc "me souvenir de plus tard":)
; et j'utilise également--no-pager
pour supprimer le frailess
lors de l'utilisationgit log
.Donc, en supposant que vous êtes dans un répertoire, avec un sous-dossier
myrepo_git
qui est ungit
référentiel; on pourrait faire:Donc, au moins dans mon cas spécifique d'historique entièrement linéaire sans branches, les numéros de révision semblent correspondre à cette approche - et en outre, il semble que cette approche permettra d'utiliser
git log
avec des plages de révision, tout en obtenant les bons numéros de révision - YMMV avec un contexte différent, cependant ...J'espère que cela aide quelqu'un,
Cheers!
EDIT: Ok, ici c'est un peu plus facile, avec des
git
alias pour les boucles ci-dessus, appeléessetlinrev
etunsetlinrev
; lorsque dans votre dossier de dépôt git, faites ( Notez l'bash
échappement méchant , voir aussi # 16136745 - Ajoutez un alias Git contenant un point-virgule ):... afin que vous puissiez simplement l'invoquer
git setlinrev
avant d'essayer de créer un journal impliquant des notes de révision linéaires; etgit unsetlinrev
pour supprimer ces notes lorsque vous avez terminé; un exemple à l'intérieur du répertoire git repo:Le temps qu'il faudrait au shell pour terminer ces alias dépendrait de la taille de l'historique du référentiel.
la source
Pour les personnes qui ont un processus de génération Ant , vous pouvez générer un numéro de version pour un projet sur git avec cette cible:
Le résultat ressemble à ceci:
Le drapeau sale est là lorsque vous avez des fichiers non validés lorsque vous générez le numéro de version. Parce que généralement, lorsque vous créez / empaquetez votre application, chaque modification de code doit être dans le référentiel.
la source
Avec l'id SHA-1 du commit, la date et l'heure de l'heure du serveur auraient aidé?
Quelque chose comme ça:
la source
Dans le manuel Git, les balises sont une réponse brillante à ce problème:
Découvrez 2.6 Git Basics - Tagging
la source
By default, the git push command doesn’t transfer tags to remote servers.
Nous utilisons cette commande pour obtenir la version et la révision de git:
Il revient
gcc7b71f
)v2.1.0
, utilisée pour les versions)v5.3.0-88-gcc7b71f
)v5.3.0-88-gcc7b71f-dirty
)Voir également: https://www.git-scm.com/docs/git-describe#Documentation/git-describe.txt
la source
Événement post-génération pour Visual Studio
la source
Pensez à utiliser
git-rev-label
Donne des informations sur la révision du référentiel Git au format comme
master-c73-gabc6bec
. Peut remplir une chaîne de modèle ou un fichier avec des variables d'environnement et des informations de Git. Utile pour fournir des informations sur la version du programme: branche, tag, hachage de validation, nombre de validations, statut incorrect, date et heure. L'une des choses les plus utiles est le nombre de validations, sans tenir compte des branches fusionnées - uniquement le premier parent.la source