Manchmal führe ich git commit -a
aus dem Muskelgedächtnis aus, wenn ich einige Dateien oder Teile von Dateien sorgfältig inszeniert und bereit zum Commit habe, was dazu führt, dass ich meine sorgfältige Staging-Aktion verliere.
Gibt es eine Möglichkeit, git commit -a
warn zu machen, wenn gerade etwas (Datei oder Patch) läuft?
(Natürlich sollte ich einfach -a
less verwenden, um mein Problem zu lösen, aber meine Frage steht.)
Leider lässt Git es nicht zu, dass Aliase vorhandene Befehle überschreiben, anderenfalls könnten Sie diese Funktionalität einfach über einen Alias hinzufügen.
Aber Sie können dort einen Weg finden. Es würde erfordern, dass du dich umschreibst, um etwas statt git commit
- vielleicht git c
zu tippen.
So können Sie es machen:
Fügen Sie den folgenden Shell-Code irgendwo in eine Skriptdatei ein (z. B. /path/to/commit-wrapper
)
chmod a+x /path/to/commit-wrapper
git config --global alias.c '!/path/to/commit-wrapper'
git c
anstelle von git commit
. Wenn Git geändert wird, um Aliase für vorhandene Befehle zuzulassen, ändern Sie die letzte Zeile in "$(git --exec-path)"/git-commit "$@"
, um eine Endlosschleife zu vermeiden.
Fügen Sie in Ihrem Repo einen pre-commit
hooke hinzu, etwa wie folgt:
Das sollte dir helfen, dein "Muskelgedächtnis" zu überwinden.
Leider kann der Pre-Commit-Hook nicht stark genug sein, um mehr Checks auszuführen (als ob Sie das Argument -a
zum Commit angegeben hätten.) Wenn Sie -a
ausführen, wird der Pre-Commit-Hook als angezeigt Obwohl alle Dateien inszeniert wurden, werden sie nach der Ausführung als nicht gesetzt angezeigt. Sie können also nicht zwischen dem, was Sie zuvor inszeniert haben, und den Dateien unterscheiden, die aufgrund von -a
bereitgestellt wurden.
Sie können Ihre bevorzugte Skriptsprache verwenden, um den Befehl git2
zu erstellen, der prüft, ob Sie ihn mit den Argumenten commit -a
ausführen. Wenn das der Fall ist, führe /usr/bin/git status --porcelain
aus und überprüfe, ob es einige Änderungen am Index gibt (Porzellan-formatierte Ausgabe ist einfacher zu parsen, meine erste Schätzung wäre es, grep '^[AMD]'
zu durchlaufen und zu prüfen, ob etwas gefunden wurde. Jetzt Sie können entweder eine Warnung ausgeben und beenden oder /usr/bin/git
ausführen, wobei alle ursprünglichen Argumente fortfahren, als gäbe es kein git2 (was Sie auch tun, wenn Sie nicht mit commit -a ausgeführt wurden).
Hier ist ein Beispiel in Perl (welches git sowieso benötigt):
%Vor% Dann erstellen Sie einen Bash-Alias alias git2 git
und Sie sind fertig.
Ich kenne keinen automatischen Weg, aber manuell ist es genau so wie in dieser Frage: Wie zeige ich die Änderungen an, die durchgeführt wurden?
Was im Wesentlichen ist:
git diff --cached
Tags und Links git