web-dev-qa-db-fra.com

Récupère le hash du dernier commit git dans le noeud

J'aimerais obtenir l'id/hash du dernier commit sur la branche actuelle de NodeJS.

Dans NodeJS, j'aimerais obtenir l'id/hash le plus récent, en ce qui concerne git et les commits.

27
Noah

Solution n ° 1 (git requis, avec rappel):

require('child_process').exec('git rev-parse HEAD', function(err, stdout) {
    console.log('Last commit hash on this branch is:', stdout);
});

Vous pouvez éventuellement utiliser execSync() pour éviter le rappel.

Solution n ° 2 (aucun git requis):

  • obtenir le contenu du fichier .git/HEAD
  • si le repo git est à l'état de tête détachée, le contenu sera le hachage
  • si le repo git se trouve sur une branche, le contenu sera comme: "refs: refs/head/nom-branche-courante"
  • récupère le contenu de .git/refs/heads/current-branch-name
  • gérer toutes les erreurs possibles dans ce processus
  • pour obtenir directement le dernier hash de la branche master, vous pouvez obtenir le contenu du fichier: .git/refs/heads/master

Cela peut être codé avec quelque chose comme:

const rev = fs.readFileSync('.git/HEAD').toString();
if (rev.indexOf(':') === -1) {
    return rev;
} else {
    return fs.readFileSync('.git/' + rev.substring(5)).toString();
}
33
edin-m

Solution courte, aucun module externe nécessaire (alternative synchrone à la réponse d'Edin):

revision = require('child_process')
  .execSync('git rev-parse HEAD')
  .toString().trim()

et si vous voulez spécifier manuellement le répertoire racine du projet git, utilisez le deuxième argument de execSync pour passer la cwdoption , comme execSync('git rev-parse HEAD', {cwd: __dirname})

80
antoine129

Utilisation de nodegit , avec path_to_repo défini comme une chaîne contenant le chemin du référentiel pour lequel vous souhaitez obtenir la validation sha. Si vous souhaitez utiliser le répertoire à partir duquel votre processus est en cours d'exécution, remplacez path_to_repo par process.cwd():

var Git = require( 'nodegit' );

Git.Repository.open( path_to_repo ).then( function( repository ) {
  return repository.getHeadCommit( );
} ).then( function ( commit ) {
  return commit.sha();
} ).then( function ( hash ) {
  // use `hash` here
} );
11
Paulpro

Si vous êtes toujours sur une branche spécifique, vous pouvez lire .git/refs/heads/<branch_name> pour obtenir facilement le hachage de validation.

const fs = require('fs');
const util = require('util');

util.promisify(fs.readFile)('.git/refs/heads/master').then((hash) => {
    console.log(hash.toString().trim());
});
2
hakatashi

Vous pouvez aussi utiliser git-fs (son nom sur npm est git-fs, sur Github c'est node-git.)

Git('path/to/repo')
Git.getHead((err, sha) => {
    console.log('The hash is: ' + sha)
})

Le même module peut lire les répertoires et les fichiers du référentiel.

0
Noah