2009-05-29 7 views
43

Sto cercando un'alternativa git a "svn info".git alternative a "svn info" che possono essere incluse in una build per la tracciabilità?

Oggi aggiungo alcune informazioni che SubVersion mi fornisce con il comando "svn info" direttamente nella mia build, e che viene poi inserito in un file sorgente che lo stampa durante l'avvio. In questo modo so sempre da dove viene questa build e come recuperarla di nuovo.

Se si dispone di "informazioni svn" come URL, root di repository, UUID repository e Revisione, si dispone di un buon collegamento tra ciò che viene distribuito e il buildsystem. E se qualcuno segnala un bug, sai da dove proviene il software, e dal momento che quell'informazione è stata automaticamente inclusa, il rischio di errore umano è minore.

Ora la domanda è: quali informazioni sono necessario ottenere da git in modo da poter identificare in seguito da dove proviene quella build? E come utilizzare tali informazioni per tornare esattamente a quella versione?

(Forse ho bisogno di aggiungere alcune informazioni sui "costruire computer di" pure poiché git è distribuito.)

Grazie Johan


Aggiornamento: Uso rev-parse era veramente utile, ho qualcosa di simile:

[email protected]:~/git_test$ git rev-parse HEAD 
72ce5f3e13c61f76fde5c58cefc85eed91b6f1f8 

E con questo m numero agic è più tardi possibile fare

[email protected]:~/git_test$ git checkout 72ce5f3e13c61f76fde5c58cefc85eed91b6f1f8 

E sono tornato dove ero.


Aggiornamento: penso che se prendo alcune parti di che gli script VonC fornito e li metto nel mio BuildFile mi metterò il risultato che cercavo.


Aggiornamento: Una nota sulla "git descrivere", è necessario un vero e proprio tag (tag -a) in precedenza nella storia si ramo per fare questo lavoro o si otterrà qualcosa di simile.

fatal: cannot describe '72ce5f3e13c61f76fde5c58cefc85eed91b6f1f8' 

Il problema è descritto anche qui http://www.rockstarprogrammer.org/post/2008/oct/16/git-tag-does-wrong-thing-default/

Ma vi prego di notare che un checkout sembra funzionare in ogni caso, anche tu che era un messaggio di errore.

git checkout 72ce5f3e13c61f76fde5c58cefc85eed91b6f1f8 

La cosa normale tu sembra essere che si crea qualcosa come un tag "ver1.0", e poi se si continua a lavorare si ottiene qualcosa di simile:

[email protected]:~/git_test$ git describe 
ver1.0-2-g4c7a057 
[email protected]:~/git_test$ git tag -a ver2.0 
[email protected]:~/git_test$ git describe 
ver2.0 
[email protected]:~/git_test$ git commit . -m "something..." 
Created commit ac38a9d: something... 
1 files changed, 1 insertions(+), 0 deletions(-) 
[email protected]:~/git_test$ git describe 
ver2.0-1-gac38a9d 

Così, quando si usa descrivere correttamente funziona e può produrre più risultati leggibili dall'uomo e può essere davvero utile.

Grazie Johan

+0

@Johan: la sceneggiatura che menziono di seguito è piuttosto loquace e progettata per simulare parte del comando "svn info". È sempre possibile ridurlo a una versione più concisa. – VonC

+0

@VonC: hai un punto valido lì. – Johan

risposta

26

Per completare la risposta di Charles, è anche possibile fare uno script che visualizza "info sn" come le informazioni, come this one (già mentioned there)

#!/bin/bash 

# author: Duane Johnson 
# email: [email protected] 
# date: 2008 Jun 12 
# license: MIT 
# 
# Based on discussion at http://kerneltrap.org/mailarchive/git/2007/11/12/406496 

pushd . >/dev/null 

# Find base of git directory 
while [ ! -d .git ] && [ ! `pwd` = "/" ]; do cd ..; done 

# Show various information about this git directory 
if [ -d .git ]; then 
    echo "== Remote URL: `git remote -v`" 

    echo "== Remote Branches: " 
    git branch -r 
    echo 

    echo "== Local Branches:" 
    git branch 
    echo 

    echo "== Configuration (.git/config)" 
    cat .git/config 
    echo 

    echo "== Most Recent Commit" 
    git log --max-count=1 
    echo 

    echo "Type 'git log' for more commits, or 'git show' for full commit details." 
else 
    echo "Not a git repository." 
fi 

popd >/dev/null 

che produrrebbe qualcosa come:

== Remote URL: origin [email protected]:canadaduane/my-project.git 
== Remote Branches: 
    origin/work 
    trunk 
    [email protected] 
    [email protected] 
    [email protected] 

== Local Branches: 
    master 
* work 

== Configuration (.git/config) 
[core] 
    repositoryformatversion = 0 
    filemode = true 
    bare = false 
    logallrefupdates = true 
[svn-remote "svn"] 
    url = svn+ssh://svn.my-project.com/srv/svn 
    fetch = my-project/trunk:refs/remotes/trunk 
[remote "origin"] 
    url = [email protected]:canadaduane/my-project.git 
    fetch = refs/heads/*:refs/remotes/origin/* 
[github] 
    user = canadaduane 
    repo = my-project 

== Most Recent Commit 
commit b47dce8b4102faf1cedc8aa3554cb58d76e0cbc1 
Author: Duane Johnson <[email protected]> 
Date: Wed Jun 11 17:00:33 2008 -0600 

    Added changes to database schema that will allow decentralization from content pointers table 

type 'git log' for more, or 'git show' for full commit details. 
+1

È molto loquace, ma sembra che ci siano molte informazioni utili in questa piccola sceneggiatura;) – Johan

+0

@Johan: lo script che ho menzionato sopra è piuttosto loquace e progettato per simulare parte del comando "svn info". È sempre possibile ridurlo a una versione più concisa. – VonC

7

in git, il commit id è unico in un progetto anche attraverso il codice distibuted. Puoi anche eseguire il checkout di un ID commit, quindi se vuoi un identificatore che ti consenta di tornare allo stato del codice che ha generato una build hai solo bisogno dell'ID commit.

git rev-parse HEAD 

Naturalmente, probabilmente vogliono essere sicuri che non ci siano modifiche in sospeso nella struttura di lavoro o di un indice in modo che si potrebbe desiderare di controllare che non c'è nessuna uscita a qualcosa di simile:

git diff --name-status HEAD 

o semplicemente utilizzare il codice di uscita:

git diff --quiet HEAD 

le uniche cose che si potrebbe desiderare di registrare sulla macchina di costruzione sono fattori ambientali come le versioni a catena strumento e quale stato alcun strumenti che non provengono dal repository erano in.

Se si dispone di un repository principale centrale è possibile registrare l'url di questo, anche se, come il commit id è univoco in tutti i cloni del progetto non è le informazioni critiche per l'identificazione il commit.

+2

Buoni punti.+1 – VonC

3
git describe 

è tutto ciò di cui hai bisogno. Assicurati di aver creato almeno un tag (corretto).

+1

Dai anche un'occhiata a come Git stesso e il kernel Linux lo usano tramite lo script GIT-VERSION-GEN e il suo uso in Makefile per cambiare @ VERSION @ in es. 1.6.0-rc2 –

+0

Questo sembra dipendere da qualche azione dell'utente ... il che significa che sembra essere soggetto a errori e lì per non molto utile? o mi sono perso qualcosa? – Johan

+0

Mi è mancato qualcosa, il tag -a ... ha aggiunto un aggiornamento alla mia domanda a riguardo ... – Johan

3

Non so se questo è quello che vuoi, ma se vuoi incorporare qualche tipo di informazione di versione durante il tempo di compilazione, tagga i tuoi rilasci di punti e dai un'occhiata a come Git stesso lo fa (il kernel di Linux usa il stesso meccanismo) utilizzando Makefile e GIT-VERSION-GEN script (entrambi i collegamenti sono su gitweb all'indirizzo repo.or.cz).

GIT-VERSION-GEN utilizza a sua volta git-describe.

66

So che la risposta è già stata accettata ma questo può aiutare qualcuno che sta cercando informazioni remote e di filiale.

git remote show origin 
+1

Questa risposta accettata è troppo coinvolgente. Questo è molto più veloce e fornisce le informazioni equivalenti a 'svn info'. – zmonteca

+6

'git remote -v' è ancora più corto. ricorda che git è distribuito. le informazioni sul repository sono ciò che state vedendo e nient'altro. se vuoi informazioni sul repository remoto che ti capita di premere su/fetch da, allora 'git remote' è quello che vuoi. '-v' mostra l'url. – gcb

6

È possibile ottenere le informazioni a distanza, come si ottiene in 'svn info' da:

 
git remote -v 
0

Ecco gitinfo.ps1 (o Get-GitInfo.ps1 per i puristi), una versione di PowerShell di Script della shell di Duane Johnson:

# From http://stackoverflow.com/a/924657/990504 
# Duane Johnson's script translated to PowerShell by Jonathan Fischer 2015.04.25 

Push-Location . 

# Find base of git directory 
while ($true) 
{ 
    if (Test-Path -PathType container .git) 
    { 
    # Show various information about this git directory 
    Write-Output "== Remote URL: $(git remote -v)" 

    Write-Output "`n== Remote Branches: " 
    git branch -r 

    Write-Output "`n== Local Branches:" 
    git branch 

    Write-Output "`n== Configuration (.git/config)" 
    Get-Content .git/config 

    Write-Output "`n== Most Recent Commit" 
    git log --max-count=1 

    Write-Output "Type 'git log' for more commits, or 'git show' for full commit details." 
    break 
    } 

    # Try parent directory. 
    Set-Location .. 
    # Stop if at root of drive. 
    if ((Get-Location).Path -match "[A-Z]:\\$") 
    { 
    Write-Error "Not a Git repository." 
    break 
    } 
} 

# Note: even though the popd was not strictly necessary in the bash version 
# unless the script was sourced/dotted, PowerShell has the questionable behavior 
# where scripts modify the current directory (and environment!) of the calling 
# process. So we need the Pop-Location. 
Pop-Location 
Problemi correlati