Es gibt einige Skripte, die nicht richtig funktionieren, wenn sie nach Änderungen suchen.
Ich habe es so versucht:
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
Gibt es eine Art boolesche Prüfung, ob seit dem letzten Commit Änderungen vorgenommen wurden, oder wie kann ich wirklich testen, ob neue Änderungen an meinem lokalen Repository vorgenommen wurden?
Ich mache das alles für ein Skript zur Versionserstellung (das ich irgendwo hier gefunden habe).
git status
?Antworten:
Was Sie tun, wird fast funktionieren: Sie sollten zitieren,
$CHANGED
falls es leer ist, und-z
auf leer testen, was bedeutet, dass keine Änderungen vorgenommen werden. Was Sie meinten war:Ein Zitat von Git
GIT-VERSION-GEN
:Es sieht so aus, als hätten Sie das kopiert, aber Sie haben dieses Detail des Zitierens einfach vergessen.
Natürlich können Sie dies auch einfach tun:
Oder wenn Sie sich nur für den Fall "etwas hat sich geändert" interessieren:
Die Verwendung
--quiet
hat den Vorteil, dass Git die Verarbeitung stoppen kann, sobald es auf einen einzelnen Unterschied stößt, sodass möglicherweise nicht der gesamte Arbeitsbaum überprüft werden muss.quelle
git diff --no-ext-diff --quiet --exit-code
, um den schmutzigen Zustand zu bestimmen.--no-ext-diff
Option ist gut für die Sicherheit (falls jemand einen externen Diff-Treiber konfiguriert hat), obwohl dies--exit-code
nicht erforderlich sein sollte, da dies impliziert ist--quiet
.git diff-index
meldet Änderungen, auch wenn sich nur die Änderungszeiten der Dateien geändert haben (und nicht deren Inhalt). Wenn Sietouch
eine Datei haben, wird eine Änderung gemeldet, die beim Ausführengit status
zurückgesetzt wird. Die Verwendunggit status
wie unten ist besser.Verwenden von
git status
:quelle
git status --porcelain --untracked-files=no
]]; dannif [[ $(git status --porcelain | wc -l) -gt 0 ]]; then echo CHANGED else echo NOT CHANGED locally fi
git status --porcelain
Sie aus, ob die Ausgabe nicht leer ist. Wenn ja, bedeutet dies, dass Änderungen vorhanden sind.Obwohl Jefromis Antwort gut ist, poste ich dies nur als Referenz.
Aus dem Git-Quellcode gibt es ein
sh
Skript, das Folgendes enthält.quelle
$1
handelt es sich um eine Zeichenfolge, die eine Aufgabe benennt, die Sie ausführen möchten, und$2
eine Zeichenfolge, die optional eine benutzerdefinierte Fehlermeldung bei einem Fehler enthält. Nennen Sie es zum Beispielrequire_clean_work_tree deploy "Skipping deploy, clean up your work tree or run dev-push"
Ich hatte ein ähnliches Problem, musste aber auch nach hinzugefügten Dateien suchen. Also habe ich folgendes gemacht:
quelle
git status
ist dein FreundWechseln Sie in das Git-Verzeichnis, damit
git status
es funktioniert:Legen Sie eine Variable fest, um den Arbeitsbaum festzulegen, damit der Fehler "Diese Operation muss in einem Arbeitsbaum ausgeführt werden" nicht angezeigt wird:
Erfassen Sie die
git status
Ausgabe in einer Bash-VariablenVerwendung,
--porcelain
die garantiert, dass sie in einem Standardformat vorliegt und analysiert werden kann:Wenn -n (nicht null), haben wir Änderungen.
quelle
Das funktioniert auch:
quelle
Das funktioniert gut. Außerdem werden die betroffenen Dateien aufgelistet:
quelle
git diff --no-ext-diff --quiet --exit-code
erledigt er auch die Arbeit.Hier finden Sie eine Reihe nützlicher Bash-Skriptfunktionen, mit denen überprüft wird, ob ein Unterschied vorliegt, der an den Benutzer gedruckt und der Benutzer aufgefordert wird, Änderungen vor der Bereitstellung festzuschreiben. Es wurde für eine Heroku- und Python-Anwendung entwickelt, muss jedoch für keine andere Anwendung geändert werden.
Sie können von Gists unter folgender Adresse kopieren: https://gist.github.com/sshadmand/f33afe7c9071bb725105
quelle
Die Frage des OP ist jetzt mehr als 9 Jahre alt. Ich weiß nicht, was damals
man git-status
gesagt wurde, aber hier ist, was es jetzt sagt:Dies deutet darauf hin, dass die
--porcelain
Argument gut geeignet ist, den Status eines Repos auf Änderungen zu testen.In Bezug auf die Frage des OP: "Gibt es eine Art boolesche Prüfung, ob seit dem letzten Festschreiben Änderungen vorgenommen wurden, oder wie kann ich wirklich testen, ob neue Änderungen an meinem lokalen Repository vorgenommen wurden?"
Ich glaube nicht, dass
bash
das per se boolesche Datentypen hat , aber das mag nah genug sein:Dies kann als
if-then-else
Formular für ein Skript neu umgewandelt oder unverändert von der CLI im git repo-Ordner ausgeführt werden . Verwenden Sie andernfalls die-C
Option mit einer Pfadangabe zum interessierenden Repo:Nachtrag:
-u, --untracked-file
Option zu verwenden, um zu vermeiden, dass der Status von Dateien gemeldet wird, die ignoriert werden sollen. Beachten Sie, dass dies einen unglücklichen Nebeneffekt hat : Dateien, die neu hinzugefügt wurden, werden ebenfalls nicht angezeigt. Die Option ist in einigen Situationen nützlich , sollte jedoch vor der Verwendung sorgfältig geprüft werden.quelle
So mache ich das ...
quelle
füge dies ein
Lauf
sh checker_git.sh gitpath
quelle
Basierend auf dem Kommentar von @ Storm_m2138 zur Antwort von @ RyanMoon ( Link ) verwende ich Folgendes in
Powershell
.quelle