Celem jest uzyskanie jednoznacznego statusu, który można ocenić za pomocą polecenia powłoki.
Próbowałem, git status
ale zawsze zwraca 0, nawet jeśli są elementy do zatwierdzenia.
git status
echo $? #this is always 0
Mam pomysł, ale myślę, że to raczej zły pomysł.
if [ git status | grep -i -c "[a-z]"> 2 ];
then
code for change...
else
code for nothing change...
fi
jakikolwiek inny sposób?
aktualizacja z następującym rozwiązaniem, patrz post Marka Longaira
Próbowałem tego, ale powoduje to problem.
if [ -z $(git status --porcelain) ];
then
echo "IT IS CLEAN"
else
echo "PLEASE COMMIT YOUR CHANGE FIRST!!!"
echo git status
fi
Otrzymuję następujący błąd [: ??: binary operator expected
teraz patrzę na mężczyznę i wypróbowuję różnicę git.
=================== Kod dla mojej nadziei i miej nadzieję, że lepsza odpowiedź ======================
#if [ `git status | grep -i -c "$"` -lt 3 ];
# change to below code,although the above code is simple, but I think it is not strict logical
if [ `git diff --cached --exit-code HEAD^ > /dev/null && (git ls-files --other --exclude-standard --directory | grep -c -v '/$')` ];
then
echo "PLEASE COMMIT YOUR CHANGE FIRST!!!"
exit 1
else
exit 0
fi
git
git-status
9nix00
źródło
źródło
$(git status --porcelain)
. Ponadto, jeśli chcesz umieścić wykrzykniki w swojej wiadomości, musisz użyć pojedynczych cudzysłowów zamiast podwójnych cudzysłowów - czyliecho 'PLEASE COMMIT YOUR CHANGE FIRST!!!'
zamiast tego powinno być$(git status --porcelain)
, tak jak powiedziałem!Odpowiedzi:
Alternatywą dla sprawdzenia, czy wyjście
git status --porcelain
jest puste, jest osobne przetestowanie każdego warunku, na którym Ci zależy. Na przykład nie zawsze można przejmować się tym, czy w danych wyjściowych programugit status
.Na przykład, aby sprawdzić, czy są jakieś lokalne zmiany niestacjonarne, możesz spojrzeć na kod powrotu:
Aby sprawdzić, czy są jakieś zmiany, które są tymczasowo, ale nie zostały zatwierdzone, możesz użyć kodu powrotu:
Na koniec, jeśli chcesz wiedzieć, czy w drzewie roboczym znajdują się nieśledzone pliki, które nie są ignorowane, możesz sprawdzić, czy dane wyjściowe następującego polecenia są puste:
Aktualizacja: Pytasz poniżej, czy możesz zmienić to polecenie, aby wykluczyć katalogi w danych wyjściowych. Możesz wykluczyć puste katalogi, dodając
--no-empty-directory
, ale myślę, że aby wykluczyć wszystkie katalogi w tym wyjściu, będziesz musiał przefiltrować dane wyjściowe, na przykład za pomocą:-v
Naegrep
drodze do wyjścia tylko linie, które nie pasują do wzorca, a wzór pasuje do każdego wiersza, który kończy się/
.źródło
--quiet
(co implikuje--exit-code
) również wycisza wyjście, dla tych, którzy chcą tylko kodu zakończenia.Wartość zwracana po
git status
prostu informuje cię o kodzie zakończenia programugit status
, a nie, czy są jakieś modyfikacje do zatwierdzenia .Jeśli chcesz uzyskać wersję
git status
wyjściową bardziej czytelną dla komputera , spróbujZobacz opis,
git status
aby uzyskać więcej informacji na ten temat.Przykładowe użycie (skrypt po prostu sprawdza, czy
git status --porcelain
daje jakieś wyjście, nie jest wymagana analiza):Zwróć uwagę, że musisz zacytować łańcuch do przetestowania, czyli wyjście
git status --porcelain
. Aby uzyskać więcej wskazówek dotyczących konstrukcji testowych, zapoznaj się z Przewodnikiem po zaawansowanych skryptach Bash ( Porównanie ciągów w sekcji ).źródło
|| echo no
do zastępowania poleceń, aby obszar roboczy nie był omyłkowo zgłaszany jako czysty, jeśligit status
zasadniczo zawiedzie. Ponadto, twój kod jest (godne pochwały) zgodny z POSIX, ale skoro łączysz się z przewodnikiem po bashu, pozwól mi dodać, że jeśli używasz basha[[ ... ]]
zamiast zgodnego z POSIX[ ... ]
, nie musisz podwójnie cytować podstawiania poleceń (chociaż nie zaszkodzi)[[ -z $(git status --porcelain) ]]
.Jeśli jesteś podobny do mnie, chcesz wiedzieć, czy są:
1) zmiany w istniejących plikach 2) nowo dodane pliki 3) usunięte pliki
a konkretnie nie chcę wiedzieć o 4) nieśledzonych plikach.
To powinno wystarczyć:
Oto mój kod bash do wyjścia ze skryptu, jeśli repozytorium jest czyste. Używa krótkiej wersji opcji nieśledzonych plików:
źródło
—untracked-files=no
; Myślę, że twój test można uprościć do[[ -z $(git status --untracked-files=no --porcelain) ]]
.git status
Nie należy pisać na stderr, chyba że coś pójdzie nie tak fundamentalne - a potem nie chcą zobaczyć, że wyjście. (Jeśli chcesz bardziej niezawodnego zachowania w tym przypadku, dołącz|| echo no
do podstawienia polecenia, aby test czystości nadal kończył się niepowodzeniem). Porównania ciągów /-z
operator może obsługiwać ciągi wieloliniowe - nie ma potrzebytail
.[[ -z $(git status -u no --porcelain) ]]
[[ -z $(git status -uno --porcelain) ]]
Możliwe jest połączenie
git status --porcelain
z prostymgrep
testem.Czasami używam tego jako prostego linijka:
Dodaj
-qs
do polecenia grep, aby było ciche.źródło
git status
zakończyć się niepowodzeniem (np. uszkodzone repozytorium), Twój test omyłkowo zgłosi czysty obszar roboczy. Jedną z opcji jest użyciegit status --porcelain 2>&1
, ale to spowodowałoby `` zjedzenie '' komunikatu o błędzie, gdybyś użył grep z-q
. (Zajmujące się że straci elegancję:(git status --porcelain || echo err) | grep -q .
)test -z "$(git status --porcelain)" || git pull origin master
Z kodu źródłowego git jest skrypt sh, który zawiera następujące elementy.
Ten sniplet pokazuje, jak można go używać
git diff-files
igit diff-index
dowiedzieć się, czy są jakieś zmiany w znanych wcześniej plikach. Nie pozwala jednak dowiedzieć się, czy nowy nieznany plik został dodany do drzewa roboczego.źródło
if [ -n "$(git ls-files --others --exclude-standard)" ]
bez dodatkowego pipingu lub grepingu powinno wystarczyć do wykrycia niezatwierdzonych plików.zrobiłbym test na tym:
lub to jest wyraźne:
gdzie:
- kod-wyjścia
Zakończ program używając kodów podobnych do diff (1). Oznacza to, że wychodzi z 1, jeśli były różnice, a 0 oznacza brak różnic.
--cichy
Wyłącz wszystkie wyjścia programu. Implikuje - kod-zakończenia
źródło
Trochę się spóźniłem w dyskusji, ale jeśli tylko potrzebujesz kodu zakończenia o wartości 0, jeśli
git status --porcelain
nic nie zwraca i! = 0, spróbuj tego:Spowoduje to, że liczba wierszy będzie kodem zakończenia, z ryzykiem wystąpienia problemów, gdy jest ich więcej niż 255. Więc
rozważy to;)
źródło
Używam tego w skrypcie, aby mieć:
1, gdy istnieje różnica lub nieśledzone pliki
[-z "$ (stan git --porcelain)"]
źródło
if ! git diff --quiet; then
jest czystsze i wydajniejsze (myślę). Innymi słowy, użyj kodu zakończenia, a nie standardowego wyjścia.git diff --quiet
zachowuje się inaczej niż wgit status --porcelain
przypadku zmian w pamięci podręcznej.Niezbyt ładne, ale działa:
Nie jestem pewien, czy wiadomość jest zależna od ustawień regionalnych, więc może wstaw na
LANG=C
początku.źródło