Istnieją skrypty, które nie działają poprawnie, jeśli sprawdzają zmiany.
Spróbowałem tak:
VN=$(git describe --abbrev=7 HEAD 2>/dev/null)
git update-index -q --refresh
CHANGED=$(git diff-index --name-only HEAD --)
if [ ! -z $CHANGED ];
then VN="$VN-mod"
fi
Czy jest jakiś rodzaj boolowskiego sprawdzenia, czy od ostatniego zatwierdzenia nastąpiły zmiany, lub jak mogę naprawdę sprawdzić, czy są nowe zmiany w moim lokalnym repozytorium?
Robię to wszystko dla skryptu tworzenia wersji (który gdzieś tu znalazłem).
git status
?Odpowiedzi:
To, co robisz, prawie zadziała: powinieneś cytować,
$CHANGED
jeśli jest pusty, i-z
testy, jeśli jest pusty, co oznacza brak zmian. Miałeś na myśli:Cytat z Gita
GIT-VERSION-GEN
:Wygląda na to, że to kopiowałeś, ale zapomniałeś o tym fragmencie cytowania.
Oczywiście możesz też po prostu zrobić to:
Lub jeśli interesuje Cię tylko przypadek „coś się zmieniło”:
Używanie
--quiet
ma tę zaletę, że Git może zatrzymać przetwarzanie, gdy tylko napotka pojedynczy plik różnicowy, więc może nie być konieczne sprawdzanie całego drzewa roboczego.źródło
git diff --no-ext-diff --quiet --exit-code
do określenia stanu brudnego.--no-ext-diff
opcja jest dobra ze względów bezpieczeństwa (na wypadek, gdyby ktoś skonfigurował zewnętrzny sterownik różnicowy), chociaż--exit-code
nie powinno być konieczne, ponieważ jest to sugerowane przez--quiet
.git diff-index
zgłasza zmiany, nawet jeśli zmieniły się tylko czasy modyfikacji plików (a nie ich zawartość). Jeśli masztouch
plik, zgłosi modyfikację, któragit status
zostanie zresetowana. Używaniegit status
jak poniżej jest lepsze.Używając
git status
:źródło
git status --porcelain --untracked-files=no
]]; następnieif [[ $(git status --porcelain | wc -l) -gt 0 ]]; then echo CHANGED else echo NOT CHANGED locally fi
git status --porcelain
sprawdź, czy dane wyjściowe nie są puste. Jeśli tak, oznacza to, że istnieją zmiany.Chociaż odpowiedź Jefromi jest dobra, zamieszczam to tylko w celach informacyjnych.
Z kodu źródłowego Git jest
sh
skrypt, który zawiera następujące elementy.źródło
$1
jest to ciąg z nazwą zadania, które chcesz uruchomić i$2
jest to ciąg opcjonalnie zawierający niestandardowy komunikat o błędzie w przypadku niepowodzenia. Na przykład nazwij to takrequire_clean_work_tree deploy "Skipping deploy, clean up your work tree or run dev-push"
Miałem podobny problem, ale musiałem też sprawdzić dodane pliki. Więc zrobiłem co następuje:
źródło
git status
jest twoim przyjacielemPrzejdź do katalogu Git
git status
do pracy:Ustaw zmienną, aby ustawić drzewo robocze, aby nie pojawił się błąd „Ta operacja musi być wykonywana w drzewie roboczym”:
Przechwyć dane
git status
wyjściowe do zmiennej BashUżyj,
--porcelain
co gwarantuje, że będzie w standardowym formacie i można je przeanalizować:Jeśli -n (nie null), mamy zmiany.
źródło
To też działa:
źródło
To działa dobrze. Zawiera również listę plików, których to dotyczy:
źródło
git diff --no-ext-diff --quiet --exit-code
również działa.Oto ładny zestaw funkcji skryptowych Bash, które sprawdzają, czy istnieje różnica, drukuje je użytkownikowi i pyta użytkownika, czy chciałby zatwierdzić zmiany przed wdrożeniem. Jest zbudowany dla aplikacji Heroku i Python, ale wymaga niewielkich zmian w przypadku innych aplikacji.
Możesz skopiować z Gists na: https://gist.github.com/sshadmand/f33afe7c9071bb725105
źródło
Pytanie PO ma już ponad 9 lat. Nie wiem, co
man git-status
wtedy powiedziało, ale oto, co mówi teraz:Sugeruje to, że
--porcelain
argument ten dobrze nadaje się do testowania stanu repozytorium pod kątem zmian.Napisz pytanie OP: "Czy istnieje jakiś rodzaj boolowskiego sprawdzenia, czy od ostatniego zatwierdzenia nastąpiły zmiany, lub jak mogę naprawdę sprawdzić, czy są nowe zmiany w moim lokalnym repozytorium?"
Nie sądzę, że
bash
ma logicznych typów danych na se , ale może to być wystarczająco blisko:Można to przesłać ponownie jako
if-then-else
formularz dla skryptu lub wykonać w wierszu poleceń CLI w folderze repozytorium git . W przeciwnym razie użyj-C
opcji ze specyfikacją ścieżki do interesującego nas repozytorium:Uzupełnienie:
-u, --untracked-file
opcji, aby uniknąć zgłaszania statusu plików, które chce się ignorować. Zauważ, że ma to niefortunny efekt uboczny : nowo dodane pliki również nie mają statusu. Ta opcja jest przydatna w niektórych sytuacjach , ale rozważ ją dokładnie przed użyciem.źródło
Oto jak to robię ...
źródło
wklej to
biegać
sh checker_git.sh gitpath
źródło
Na podstawie komentarza @ storm_m2138 do odpowiedzi @ RyanMoon ( link ) używam następującego w
Powershell
.źródło