Wie kann ich automatisch gewarnt werden, wenn sich eine bestimmte Datei ändert?

Lesezeit: 4 Minuten

Ich habe ein PHP-Projekt, und wenn ich aus einem anderen Repository ziehe und die Datei composer.lock geändert wird, soll ich laufen composer.phar install --dev. Wie kann Git mich automatisch warnen / fragen, ob ich diesen Befehl ausführen möchte? Ich nehme an, eine Art Haken würde ausreichen, aber wie kann ich nur Informationen darüber erhalten, was sich vor und nach dem Einziehen geändert hat?

Benutzer-Avatar
mvp

Es hängt davon ab, welche Option Sie beim Ziehen verwenden:

Keine Option: git fetch und git merge werden ausgeführt

Sie können Ihre eigenen schreiben Post-Merge-Git-Hook:

Dieser Hook wird von Git Merge aufgerufen, was passiert, wenn ein Git-Pull auf einem lokalen Repository durchgeführt wird. Der Hook nimmt einen einzigen Parameter, ein Status-Flag, das angibt, ob die durchgeführte Zusammenführung eine Squash-Zusammenführung war oder nicht. Dieser Hook kann das Ergebnis von Git-Merge nicht beeinflussen und wird nicht ausgeführt, wenn die Zusammenführung aufgrund von Konflikten fehlgeschlagen ist.

Dieser Hook sollte für Sie funktionieren (speichern Sie dies als ausführbare Datei .git/hooks/post-merge):

#!/bin/sh

CHANGED=`git diff [email protected]{1} --stat -- $GIT_DIR/../composer.lock | wc -l`
if [ $CHANGED -gt 0 ];
then
    echo "composer.lock has changed!"
    composer.phar install --dev
fi

–rebase : git fetch und git rebase werden ausgeführt

Sie können Ihre eigenen schreiben Post-Checkout-Git-Hook:

Dieser Hook wird aufgerufen, wenn ein Git-Checkout ausgeführt wird, nachdem der Worktree aktualisiert wurde. Dem Hook werden drei Parameter gegeben: die Referenz des vorherigen HEAD, die Referenz des neuen HEAD und ein Flag, das angibt, ob das Auschecken ein Zweig-Auschecken oder ein Datei-Auschecken war

Dieser Hook sollte für Sie funktionieren (speichern Sie dies als ausführbare Datei .git/hooks/post-checkout):

#!/bin/sh

CHANGED=`git diff $1 $2 --stat -- $GIT_DIR/../composer.lock | wc -l`
if [ $CHANGED -gt 0 ];
then
    echo "composer.lock has changed!"
    composer.phar install --dev
fi

AKTUALISIEREN

Hier ist mein persönlicher Satz von Git-Hooks.

  • Klappt wunderbar! Danke vielmals!

    – greg0ire

    31. Mai 2013 um 9:54 Uhr

  • Was meinst du mit ziehen? Da der einfache Abruf den lokalen Zweig nicht aktualisiert. Pull wird, aber nur, wenn es einen Tracking-Zweig war. Solange Ihr Vorgang die Aktualisierung Ihrer Steuerdatei beinhaltet, sollte der Post-Checkout-Hook funktionieren. Ich würde empfehlen, es zu testen, indem Sie so etwas tun git reset --hard HEAD~20 (Spule den Kopf um viele Commits zurück) und dann git pull --rebase – Hook wird aufgerufen und ausgelöst, wenn die Steuerdatei geändert wurde (ich habe es lokal getestet).

    – mvp

    31. Mai 2013 um 10:18 Uhr

  • Ich meine: Ziehen Sie aus einem Remote-Repository. Ich habe mit einem sehr einfachen Skript getestet und es funktioniert nicht. git pull --rebase funktioniert.

    – greg0ire

    31. Mai 2013 um 10:42 Uhr

  • Da ist ein post-merge hookhat aber nicht die gleichen Argumente wie die post-checkout. Schade…

    – greg0ire

    31. Mai 2013 um 11:28 Uhr

  • Tatsächlich könnte es nützlich sein, wenn die Zusammenführung keine schnelle Vorwärtszusammenführung ist: ‘HEAD^’ ist der Commit vor dem Pull, also sollte es in diesem Fall funktionieren. Irgendeine Idee für den schnellen Vorlauf?

    – greg0ire

    31. Mai 2013 um 11:42 Uhr

Benutzer-Avatar
naXa steht zur Ukraine

Hier ist ein interessanter Kern: https://gist.github.com/sindresorhus/7996717 Ich habe es für Ihre Frage angepasst.

Post-Merge-Git-Hook wird ausgeführt, wenn Sie Zweige zusammenführen oder wenn Sie dies tun git pull.

Post-Merge-Hook (Dokumente lesen)

#/usr/bin/env bash
# MIT © Sindre Sorhus - sindresorhus.com
# forked by naXa! - naxa.by

# Git hook to run a command after `git merge` / `git pull` if a specified file was changed.
# Run `chmod +x post-merge` to make it executable then put it into `.git/hooks/`.

changed_files="$(git diff-tree -r --name-only --no-commit-id ORIG_HEAD HEAD)"

check_run() {
  echo "$changed_files" | egrep --quiet "$1" && echo "$2"
}

# In this example it's used to print a warning if composer.lock has been changed
check_run composer.lock "Run `composer.phar install --dev`"

Post-Checkout-Git-Hook wird ausgeführt, wenn Sie zwischen Zweigen wechseln oder wenn Sie dies tun git rebase.

Post-Checkout-Haken (Dokumente lesen)

#/usr/bin/env bash
# MIT © Sindre Sorhus - sindresorhus.com
# forked by naXa! - naxa.by

# Git hook to run a command after `git checkout` if a specified file was changed.
# Run `chmod +x post-merge` to make it executable then put it into `.git/hooks/`.

# terminate gracefully on a file checkout (retrieving a file from the index)
# uncomment the below line if you don't want to run this hook on a file checkout (for example on git->revert in IntelliJ IDEA)
# [ $3 -eq 0 ] && { exit 0; }

changed_files="$(git diff-tree -r --name-only --no-commit-id $1 $2)"

check_run() {
  echo "$changed_files" | egrep --quiet "$1" && echo "$2"
}

# In this example it's used to print a warning if composer.lock has been changed
check_run composer.lock "Run `composer.phar install --dev`"

exit 0;

Sie werden vielleicht bemerken, dass ich mich verändert habe grep zu egrep hier. Dies geschieht, um mit einem ausgefallenen Ausdruck suchen zu können. Zum Beispiel "file1.txt|file2.txt" wo | wird als ODER-Operator verwendet.

  • Nett ! Fürs Protokoll, am Ende habe ich verwendet git diff-tree zu. Hier ist was ich gebaut habe

    – greg0ire

    17. Januar 2016 um 0:16 Uhr

1178860cookie-checkWie kann ich automatisch gewarnt werden, wenn sich eine bestimmte Datei ändert?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy