Git-Pre-Commit-Hooks nur für einen bestimmten Unterordner?

Lesezeit: 3 Minuten

Ich habe derzeit ein einzelnes Repo mit zwei Projekten, jedes in einem eigenen Unterordner: eines in C# und eines in Javascript. Ich möchte einen Pre-Commit-Hook haben, der jshint ausführt, aber nur, wenn sich eine der bereitgestellten Dateien im Javascript-Ordner befindet. Wenn die bereitgestellten Dateien nur aus dem C#-Ordner stammen, wird der Pre-Commit-Hook nicht ausgeführt.

Ist das überhaupt möglich? Oder ist meine einzige Lösung, die beiden Projekte in ihre eigenen Repos aufzuteilen?

  • Wie ist das Depot aufgeteilt? ein Zweig für jedes Projekt ?

    – okio

    15. Oktober 2014 um 7:36 Uhr

  • Selbes Problem hier. Wir haben ein unabhängiges Projekt pro Verzeichnis, alle im selben Git-Repo, und wenn ich ein Verzeichnis festschreibe, möchte ich nur die Tests dieses Verzeichnisses ausführen

    – Nürettin

    22. Oktober 2014 um 9:33 Uhr

  • Ich habe ein kleines Tool geschrieben pypi.org/project/hooks4git um beim Umgang mit Git-Hooks zu helfen. Obwohl es nicht direkt unterstützt wird, können Sie ein benutzerdefiniertes Skript in seiner Konfigurationsdatei aufrufen, das Ihre Frage löst. Dieses Tool kann jedoch leicht aktualisiert werden, um dies zu unterstützen. Ich mochte die Idee und habe dort ein Problem erstellt: github.com/lovato/hooks4git/issues/23

    – Lovato

    6. August 2018 um 19:36 Uhr


Angeben files beinhalten (bzw exclude auszuschließen) bestimmte Verzeichnisse, z. B. Hooks nur in ausführen my_dir:

files: ^my_dir/
repos:
-   repo: https://github.com/pre-commit/pre-commit-hooks
    hooks:
        ...

oder renne überall hin, außer drinnen my_dir:

exclude: ^my_dir/
repos:
-   repo: https://github.com/pre-commit/pre-commit-hooks
    hooks:
        ...

Wenn Sie eine lange Liste von Ausschlüssen haben, verwenden Sie ausführliche Regex:

exclude: >
  (?x)^(
      path/to/file1.py|
      path/to/file2.py|
      path/to/file3.py
  )$

Sie können diese auch nur auf bestimmte Hooks anwenden, tun Sie einfach:

-   id: my-hook
    exclude: ^my_dir/

  • Fügen Sie vielleicht nur einen kleinen Hinweis hinzu, dass die Multiline nur für Dateien gilt. Das $ am Ende könnte einige Leute abschrecken. Habe dies einige Zeit debuggt, bevor ich es bemerke.

    – MindTooth

    16. April 2021 um 12:29 Uhr

  • Wie wähle ich zwei Ordner aus?

    – Dr_Zaszuś

    7. Mai 2021 um 10:27 Uhr

  • Was sollen Sie mit diesem YAML-Code tun? Precommit-Hooks sind nur sh/cmd-Skripte, also wo sollen Sie das verwenden?

    – jnovacho

    27. Juni um 11:26 Uhr

Sie können verwenden git log um herauszufinden, ob der letzte Commit in einem Unterverzeichnis mit dem letzten Commit in Ihrem Repository-Root übereinstimmt:

#!/bin/env bash

function get_commit {
    git log --oneline -- $1 | head -n 1 | cut -d " " -f1
}

ROOT_COMMIT=$(get_commit)
SUBDIR_COMMIT=$(get_commit my/subdir/path)

if [ "$SUBDIR_COMMIT" == "$ROOT_COMMIT" ]; then
    # do pre-commit hook stuff here
fi

Hier sind gute native Lösungen.

Ich benutze so etwas

if git diff --cached --quiet -- "frontend/"
then
  echo "Unchanged"
  exit 0
else
  echo "Changed"
fi

Benutzer-Avatar
Sam

Git-Hooks sind Skripte, die Git ausführt, bevor oder nachdem es bestimmte Dinge tut.

Wenn Sie ein Skript schreiben und es speichern als <repository_name>/.git/hooks/pre-commit dann wird git es vor dem Commit ausführen. Schreiben Sie also ein einfaches Skript für das von Ihnen verwendete Betriebssystem, das jshint für diesen Unterordner ausführt, und speichern Sie es in diesem Pfad.

Git führt Ihren Pre-Commit-Hook nicht mit irgendwelchen Argumenten aus. Sie können Git-Befehle verwenden, um den Zustand Ihres Repositorys herauszufinden (die als Teil des Commit hinzugefügten Änderungen werden immer noch nur bereitgestellt und sind über –cached zugänglich). Wenn Sie Änderungen vornehmen und möchten, dass sie Teil des Commit werden, müssen Sie sie hinzufügen, bevor das Skript beendet wird.

Sie arbeiten mit C#, daher sollten Sie sich darüber im Klaren sein, dass Git-Hooks unter Windows etwas eigenartig sind: Ausführen von Git-Hooks unter Windows

Wenn Sie Pre-Commit neuer als v1.1.0 verwenden, können Sie eine hinzufügen exclude Feld zu Ihrem .pre-commit-config.yaml die sich im Stammordner Ihres Repos befindet.

Genau wie unten:

exclude: '^(?!javascript/)'

Überprüfen Sie das Dokument hier

  • kann man das machen enthalten nur einen bestimmten Ordner?

    – Baxx

    9. Juli 2020 um 17:13 Uhr

  • kann man das machen enthalten nur einen bestimmten Ordner?

    – Baxx

    9. Juli 2020 um 17:13 Uhr

1216610cookie-checkGit-Pre-Commit-Hooks nur für einen bestimmten Unterordner?

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

Privacy policy