2015-12-29 26 views
14

Vorrei ottenere l'id/hash del commit più recente sul ramo corrente in NodeJS.Ottieni hash del commit git più recente nel nodo

In NodeJS, mi piacerebbe ottenere l'id/hash più recente, per quanto riguarda git e commit di ciò.

+0

e dove sei bloccato? – Sirko

+0

@Sirko All'inizio? – Noah

+0

Sembra che tu abbia già trovato il modulo nodo corretto. Afaik ci sono stati esempi per fare esattamente quello che vuoi. – Sirko

risposta

13

Oltre a Paulpro Risposta Puoi usare il exec.

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

Scegliendo questo perché mi piace che non devi specificare un 'path_to_repo' come nella risposta di Paulpro. – Noah

8

Utilizzo di nodegit, con path_to_repo definito come una stringa contenente il percorso del repository per il quale si desidera ottenere il commit. Se si desidera utilizzare la directory il processo è in esecuzione da, quindi sostituire path_to_repo con 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 
}); 
+0

solo FIY sulla mia macchina, questo è circa 3,2 volte più veloce della risposta più accettata da @ antoine129. execSync impiega circa 6.4 ms mentre nodegit richiede solo circa 1.8ms – Capaj

0

È inoltre possibile utilizzare git-fs (il suo nome sul NPM è git-fs, su Github è il nodo-git.)

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

Lo stesso modulo può leggere le directory ei file dal repo.

44

soluzione a breve, nessun modulo esterno necessario (alternativa sincrona alla risposta di Edin):

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

e se si desidera specificare manualmente la directory principale del progetto Git, utilizzare il secondo argomento di execSync per passare il cwdoption, come execSync('git rev-parse HEAD', {cwd: __dirname})

+5

Usa '.slice (0, 7);' per ottenere brevi sha. –

+11

@DanielSteigerwald o 'git rev-parse --short HEAD' – Hendry

0

Se siete sempre in specifico ramo, è possibile leggere .git/refs/heads/<branch_name> per ottenere facilmente commettere hash.

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

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