2010-04-29 11 views
7

Per garantire che la mia analisi scientifica sia riproducibile, vorrei verificare a livello di codice se ci sono delle modifiche al codice di base che non sono state verificate e, in caso contrario, stampare quale commit viene utilizzato.Stampa di git a livello di programmazione e controllo di modifiche non salvate

Ad esempio, se vi sono modifiche non, dovrebbe uscita

Warning: uncommitted changes made. This output may not be reproducible. 

Altrimenti, producono

Current commit: d27ec73cf2f1df89cbccd41494f579e066bad6fe 

Idealmente, dovrebbe usare "idraulico", non "porcellana".

risposta

1

Questo utilizza la porcellana, ma le uscite git diff --exit-code con 1 se ci sono differenze con i file esistenti e 0 se non ci sono differenze con i file esistenti. Sfortunatamente, non controlla i file non tracciati.

This answer to Come recuperare l'hash per il commit corrente in Git? sostiene git rev-parse --verify HEAD per stampare il commit corrente.

8

I bit di Git idraulico che serve sono diff-index, rev-parse --verify e forse rev-parse --show-cdup con ls-files --others.

Il seguente programma di shell utilizza i comandi idraulici Git, ha una gestione non tracciata/ignorata regolabile ed è abbastanza attento a tutti i possibili casi di errore.

#!/bin/sh 

# warn-unclean: print a warning if the working tree and index are not clean 

# For utmost strictness, set check_untracked=yes and check_ignored=yes. 
# When both are 'yes', verify that working tree and index are identical to HEAD. 
# When only check_untracked is yes, extra ignored files are allowed. 
# When neither is yes, extra untracked files and ignored files are allowed. 

check_untracked=yes 
check_ignored=yes 

warn() { 
    echo 'Warning: '"$*" \ 
     'This output may not be reproducible.' 
} 

# Compare HEAD to index and/or working tree versions of tracked files 
git diff-index --quiet HEAD 
case $? in 
    0) 
     if test "$check_untracked" != yes; then 
      clean=yes 
     else 
      # Still need to check for untracked files 

      or_ignored='' 
      exclude=--exclude-standard 
      if test "$check_ignored" = yes; then 
       or_ignored=' or ignored' 
       exclude='' 
      fi 

      (
       # Move to top level of working tree 
       if up="$(git rev-parse --show-cdup)"; then 
        test -n "$up" && cd "$up" 
       else 
        echo 'error running "git rev-parse --show-cdup"' 
        exit 129 
       fi 

       # Check for untracked files 
       git ls-files --others $exclude --error-unmatch . >/dev/null 2>&1 
       case $? in 
        0) # some untracked/ignored file is present 
         warn 'some untracked'"$or_ignored"' file is present.' 
         exit 1 
        ;; 
        1) # no untracked files 
         exit 0 
        ;; 
        *) 
         echo 'error running "git diff-index"!' 
         exit 129 
        ;; 
       esac 

      ) 
      case $? in 
       0) clean=yes ;; 
       1) clean=no ;; 
       *) exit $? ;; 
      esac 
     fi 

     test "$clean" = yes && 
     if c="$(git rev-parse --verify HEAD)"; then 
      echo 'Current commit: '"$c" 
     else 
      echo 'error running "git rev-parse --verify"!' 
     fi 
    ;; 
    1) 
     warn 'some tracked file has an uncommitted change.' 
    ;; 
    *) 
     echo 'error running "git diff-index"!' 
     exit 129 
    ;; 
esac 

Si potrebbe cospargere in alcuni altri exit s se si desidera che il suo codice di uscita per essere significativa in tutti i casi.

Se non si cura per tutta la gestione degli errori o la gestione non tracciata/ignorati, quindi qualcosa di breve potrebbe essere sufficiente:

if git diff-index --quiet; then 
    printf 'Current commit: %s\n' "$(git rev-parse --verify HEAD) 
else 
    echo 'Warning: …' 
fi 

Si può anche verificare la presenza di file non monitorate (che potrebbe essere ottimizzato per ignorato, ecc) in modo terso, senza gestione degli errori:

git ls-files --others --exclude-standard --error-unmatch \ 
    "./$(git rev-parse --show-cdup)" >/dev/null 2>&1 
Problemi correlati