<!-- mobian-agent-page publisher="dailydev" canonical="https://daily.dev/posts/git-hooks-upgraded-what-s-new-in-git-2-54-and-coming-in-2-55-ic8epa97z" -->

---
title: Git hooks, upgraded: What's new in Git 2.54 and coming...
description: Git 2.54 introduces config-based hooks, allowing developers to define hooks at system, global, or local config levels rather than per-repository shell scripts....
canonical: https://daily.dev/posts/git-hooks-upgraded-what-s-new-in-git-2-54-and-coming-in-2-55-ic8epa97z
twitter:card: summary_large_image
twitter:site: @dailydotdev
og:type: website
og:site_name: daily.dev
og:title: Git hooks, upgraded: What's new in Git 2.54 and coming in 2.55 | daily.dev
og:description: Git 2.54 introduces config-based hooks, allowing developers to define hooks at system, global, or local config levels rather than per-repository shell scripts....
og:url: https://daily.dev/posts/git-hooks-upgraded-what-s-new-in-git-2-54-and-coming-in-2-55-ic8epa97z
og:image: https://api.daily.dev/og/posts/iC8EpA97z.png
og:image:alt: Git hooks, upgraded: What's new in Git 2.54 and coming in 2.55
og:image:width: 1200
og:image:height: 630
og:locale: en
---

> ## Documentation Index
> Fetch the complete documentation index at: https://daily.dev/llms.txt
> Use this file to discover all available pages before exploring further.

# Git hooks, upgraded: What's new in Git 2.54 and coming in 2.55

**[Collabora Blog](https://daily.dev/sources/collabora)** · 6 min read · 0 upvotes · 0 comments

## Summary

Git 2.54 introduces config-based hooks, allowing developers to define hooks at system, global, or local config levels rather than per-repository shell scripts. The upcoming Git 2.55 adds opt-in parallel hook execution via a `parallel = true` flag and a `hook.jobs` knob (supporting `-1` for CPU core count), with a CLI override `git hook run -j N`. Note that some hooks like `pre-commit` cannot be parallelized due to shared resource constraints. Git 2.54 also fixes submodule path collisions — including case-insensitive filesystem collisions and security-relevant gitdir overrides — via a new `extensions.submodulePathConfig` extension and `submodule.*.gitdir` config key.

## Full article

daily.dev links to this article rather than hosting it. Read it at the original source: <https://www.collabora.com/news-and-blog/news-and-events/git-hooks-upgraded-whats-new-git-254-and-coming-255.html>

## Questions this post answers

### How do I define Git hooks in config files instead of .git/hooks scripts?

Git 2.54 introduces config-based hooks using `[hook "name"]` sections with `event` and `command` keys. These can be defined at system (`/etc/gitconfig`), global (`~/.gitconfig`), or local (`.git/config`) levels. For example: `[hook "linter"] event = pre-push command = ~/bin/linter --cpp20`. This replaces per-repository hook scripts and allows hooks to be managed centrally, including by sysadmins at the system level.

_Developers migrating hook management across many repos track Git config changes like these on daily.dev._

### Can Git hooks run in parallel and how do I configure that?

Parallel hook execution is opt-in and planned for Git 2.55. Add `parallel = true` to each hook config block and set `[hook] jobs = 2` (or `-1` to use all CPU cores). A per-event override `hook.*.jobs` is also supported. The CLI flag `git hook run -j N` lets you test parallelism without touching config. Hooks like `pre-commit` and `prepare-commit-msg` cannot be parallelized due to shared resource usage.

_Teams evaluating Git 2.55 for CI pipelines find the latest release details on daily.dev._

### What causes the 'refusing to create/use inside another submodule's git dir' error in Git and how is it fixed?

This error occurs when two submodule names collide at the gitdir level — for example, one named `foo` and another named `foo/bar` — or on case-insensitive filesystems where `Foo` and `foo` collide. Git 2.54 fixes this via a new `extensions.submodulePathConfig` extension that transparently encodes submodule gitdirs, and introduces `submodule.*.gitdir` as a single source of truth for submodule paths.

_Developers debugging submodule path issues in large monorepos find relevant Git release coverage on daily.dev._

## Similar posts on daily.dev

- [What's new in Git 2.55.0?](https://daily.dev/posts/what-s-new-in-git-2-55-0--ytx0ezs5f) · GitLab · 172 upvotes · 17 comments
- [Highlights from Git 2.55](https://daily.dev/posts/highlights-from-git-2-55-rp044xsqm) · GitHub Blog · 81 upvotes · 11 comments
- [Git 2.54.0 released](https://daily.dev/posts/git-2-54-0-released-zxgcvkj05) · LWN.net · 43 upvotes · 4 comments
- [Git 2.55 Released With Rust Support Enabled By Default, <em>git history fixup</em>](https://daily.dev/posts/git-2-55-released-with-rust-support-enabled-by-default-em-git-history-fixup-em--hs6ugtnir) · Phoronix · 1 upvotes · 0 comments

---

Tags: [#git](https://daily.dev/tags/git), [#version-control](https://daily.dev/tags/version-control)

[View this post on daily.dev](https://daily.dev/posts/git-hooks-upgraded-what-s-new-in-git-2-54-and-coming-in-2-55-ic8epa97z)

```json
{"@context":"https://schema.org","@graph":[{"@type":"Organization","@id":"https://daily.dev/#organization","name":"daily.dev","url":"https://daily.dev","logo":{"@type":"ImageObject","url":"https://daily.dev/apple-touch-icon.png","width":180,"height":180},"sameAs":["https://twitter.com/dailydotdev","https://github.com/dailydotdev","https://www.linkedin.com/company/daily-dev-ltd"]},{"@type":"WebSite","@id":"https://daily.dev/#website","url":"https://daily.dev","name":"daily.dev","publisher":{"@id":"https://daily.dev/#organization"},"potentialAction":{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https://daily.dev/search?q={search_term_string}"},"query-input":"required name=search_term_string"}}]}
{"@context":"https://schema.org","@type":"TechArticle","headline":"Git hooks, upgraded: What's new in Git 2.54 and coming in 2.55","url":"https://daily.dev/posts/git-hooks-upgraded-what-s-new-in-git-2-54-and-coming-in-2-55-ic8epa97z","mainEntityOfPage":{"@type":"WebPage","@id":"https://daily.dev/posts/git-hooks-upgraded-what-s-new-in-git-2-54-and-coming-in-2-55-ic8epa97z"},"datePublished":"2026-08-11T08:54:18.785Z","dateModified":"2026-08-11T09:26:47.067Z","description":"Git 2.54 introduces config-based hooks, allowing developers to define hooks at system, global, or local config levels rather than per-repository shell scripts....","image":"https://media.daily.dev/image/upload/f_auto,q_auto/v1/posts/e758f7e6e302d1c6dcf9f0a83f4d4a79?_a=AQAEuop","thumbnailUrl":"https://media.daily.dev/image/upload/f_auto,q_auto/v1/posts/e758f7e6e302d1c6dcf9f0a83f4d4a79?_a=AQAEuop","isAccessibleForFree":true,"articleSection":"Collabora Blog","inLanguage":"en","publisher":{"@type":"Organization","name":"daily.dev","url":"https://daily.dev","logo":{"@type":"ImageObject","url":"https://daily.dev/apple-touch-icon.png","width":180,"height":180}},"author":{"@type":"Organization","name":"Collabora Blog","logo":"https://media.daily.dev/image/upload/s--ZGZ0FjqS--/f_auto,q_auto/v1786438306/logos/collabora?_a=BAMAMicg0","url":"https://daily.dev/sources/collabora"},"commentCount":0,"discussionUrl":"https://daily.dev/posts/git-hooks-upgraded-what-s-new-in-git-2-54-and-coming-in-2-55-ic8epa97z","interactionStatistic":[{"@type":"InteractionCounter","interactionType":{"@type":"LikeAction"},"userInteractionCount":0},{"@type":"InteractionCounter","interactionType":{"@type":"CommentAction"},"userInteractionCount":0}],"keywords":"git,version-control","timeRequired":"PT6M"}
{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https://daily.dev"},{"@type":"ListItem","position":2,"name":"Collabora Blog","item":"https://daily.dev/sources/collabora"},{"@type":"ListItem","position":3,"name":"Git hooks, upgraded: What's new in Git 2.54 and coming in 2.55"}]}
{"@context":"https://schema.org","@type":"FAQPage","@id":"https://daily.dev/posts/git-hooks-upgraded-what-s-new-in-git-2-54-and-coming-in-2-55-ic8epa97z#faq","mainEntity":[{"@type":"Question","name":"How do I define Git hooks in config files instead of .git/hooks scripts?","acceptedAnswer":{"@type":"Answer","text":"Git 2.54 introduces config-based hooks using `[hook \"name\"]` sections with `event` and `command` keys. These can be defined at system (`/etc/gitconfig`), global (`~/.gitconfig`), or local (`.git/config`) levels. For example: `[hook \"linter\"] event = pre-push command = ~/bin/linter --cpp20`. This replaces per-repository hook scripts and allows hooks to be managed centrally, including by sysadmins at the system level. Developers migrating hook management across many repos track Git config changes like these on daily.dev."}},{"@type":"Question","name":"Can Git hooks run in parallel and how do I configure that?","acceptedAnswer":{"@type":"Answer","text":"Parallel hook execution is opt-in and planned for Git 2.55. Add `parallel = true` to each hook config block and set `[hook] jobs = 2` (or `-1` to use all CPU cores). A per-event override `hook.*.jobs` is also supported. The CLI flag `git hook run -j N` lets you test parallelism without touching config. Hooks like `pre-commit` and `prepare-commit-msg` cannot be parallelized due to shared resource usage. Teams evaluating Git 2.55 for CI pipelines find the latest release details on daily.dev."}},{"@type":"Question","name":"What causes the 'refusing to create/use inside another submodule's git dir' error in Git and how is it fixed?","acceptedAnswer":{"@type":"Answer","text":"This error occurs when two submodule names collide at the gitdir level — for example, one named `foo` and another named `foo/bar` — or on case-insensitive filesystems where `Foo` and `foo` collide. Git 2.54 fixes this via a new `extensions.submodulePathConfig` extension that transparently encodes submodule gitdirs, and introduces `submodule.*.gitdir` as a single source of truth for submodule paths. Developers debugging submodule path issues in large monorepos find relevant Git release coverage on daily.dev."}}]}
```

