check / check (push) Successful in 1m44s
The script wrote the hook to .git/hooks, which fails when .git is a file rather than a directory, as in a clone made with --separate-git-dir. It now asks git for the repository's own git directory with `git rev-parse --git-common-dir`, creates its hooks directory if missing, and writes the hook there. In an ordinary clone that is .git/hooks, so nothing moves. git's core.hooksPath setting is not followed, so the script never writes outside the repository; where that setting is in force, git does not run the installed hook, as before. Model: opus-5-5
23 lines
757 B
Bash
Executable File
23 lines
757 B
Bash
Executable File
#!/bin/sh
|
|
# script/install-precommit: install the git pre-commit hook that runs
|
|
# script/precommit. Our own extension to scripts-to-rule-them-all.
|
|
set -eu
|
|
|
|
ROOT="$(cd "$(dirname "$0")/.." && pwd -P)"
|
|
|
|
main() {
|
|
cd "$ROOT"
|
|
# Ask git for the repository's own git directory: .git is a file, not
|
|
# a directory, in some checkouts (for example a clone made with
|
|
# --separate-git-dir). core.hooksPath is deliberately not followed, so
|
|
# the hook is never written outside this repository.
|
|
hooks="$(git rev-parse --git-common-dir)/hooks"
|
|
mkdir -p "$hooks"
|
|
hook="$hooks/pre-commit"
|
|
printf '#!/bin/sh\nset -e\nscript/precommit\n' > "$hook"
|
|
chmod +x "$hook"
|
|
echo "pre-commit hook installed: runs script/precommit"
|
|
}
|
|
|
|
main "$@"
|