2010-04-29 10 views
7

Aby zapewnić, że moja analiza naukowa jest odtwarzalna, chciałbym programowo sprawdzić, czy są jakieś modyfikacje bazy kodu, które nie są sprawdzane, a jeśli nie, wydrukuj jakie zatwierdzenie jest używane.Programowe drukowanie wersji Git i sprawdzanie niezatwierdzonych zmian

Na przykład, jeśli istnieją niezatwierdzone zmiany, to powinien wypisać

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

Else, wytwarzają

Current commit: d27ec73cf2f1df89cbccd41494f579e066bad6fe 

Idealnie, należy użyć "hydraulika", a nie "porcelana".

Odpowiedz

1

Używa porcelany, ale git diff --exit-code kończy się z 1, jeśli istnieją różnice w stosunku do istniejących plików, oraz 0, jeśli nie ma różnic w stosunku do istniejących plików. Nie sprawdza niestety nieśledzonych plików.

This answer na Jak odzyskać skrót do bieżącego zatwierdzenia w Git? opowiada się za wydrukowaniem bieżącego zatwierdzenia, git rev-parse --verify HEAD.

8

Bity Git kanalizacji potrzebne są diff-index, rev-parse --verify i może rev-parse --show-cdup z ls-files --others.

Poniższy program powłoki używa tych poleceń Git, ma regulowaną obsługę niepotwierdzoną/zignorowaną i jest dość ostrożny we wszystkich możliwych przypadkach błędu.

#!/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 

Można posypać w jakichś bardziej exit s, jeśli chcesz jego kod wyjścia miała sens we wszystkich przypadkach.

Jeśli nie obchodzi dla całej obsługi błędów lub nieśledzonej/ignorowane manipulacji, wtedy coś krótko może wystarczyć:

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

Można również sprawdzić dla plików nieśledzonej (które mogą być manipulowane za ignorowane itp) w zwięzły sposób, bez obsługi błędów:

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