What's new in 2.11.0? ๐
git-cliff is a command-line tool that provides a highly customizable way to generate changelogs from the Git history.
What's new? โฐ๏ธโ
The full changelog can be found here.
This is going to be the last release of 2025!
Wishing you all a fantastic new year ahead filled with Git commits, automated changelogs and cliff jumps! ๐โฐ๏ธ
๐ Azure DevOps Integrationโ
git-cliff now supports Azure Devops for remote integration, enabling changelog generation with metadata from Azure DevOps repositories (commits, pull requests, and contributors). ๐ฅณ
Simply configure your cliff.toml for your own repository as follows:
# Azure DevOps integration for fetching commit metadata.
[remote.azure_devops]
owner = "shiftme/gitcliff"
repo = "git-cliff-readme-example"
And then update your [changelog].body with the relevant template variables, e.g. {{ commit.remote.pr_number }}, {{ commit.remote.username }} and so on.
e.g. results in:
## What's Changed in v1.0.0
- Initial commit by @orhun
- docs(project): add README.md by @orhun
- feat(parser): add ability to parse arrays by @orhun
- fix(args): rename help argument due to conflict by @orhun
- docs(example)!: add tested usage example by @orhun
### New Contributors
- @orhun made their first contribution
For more information, see the documentation.
Thanks to @amd989 for the implementation in #1283!
โ Failing on unmatched commitsโ
A new configuration variable was added for enforcing that all commits are matched by a commit parser:
[git]
commit_parsers = [
{ message = "^feat", group = "Should be matched" },
]
fail_on_unmatched_commit = true
If fail_on_unmatched_commit is set to true, git-cliff will fail when any commit included in the changelog is not matched by any of the configured commit_parsers.
๐งฉ New built-in filtersโ
git-cliff now has new custom filters you can use inside templates:
-
upper_first: Converts the first character of a string to uppercase.{{ "hello" | upper_first }} โ Hello -
find_regex: Finds all occurrences of a regex pattern in a string.{{ "hello world, hello universe" | find_regex(pat="hello") }} โ [hello, hello] -
replace_regex: Replaces all occurrences of a regex pattern with a string.{{ "hello world" | replace_regex(from="o", to="a") }} โ hella warld -
split_regex: Splits a string by a regex pattern.{{ "hello world, hello universe" | split_regex(pat=" ") }} โ [hello, world,, hello, universe]
๐ Increased log verbosityโ
We have evaluated and increased the verbosity of some log messages to provide better insights into the internal workings of git-cliff.
To get more detailed logs, provide one or multiple -v flags when running:
$ git cliff -vv
โจ Better include-path handlingโ
-
The
--include_path's behavior has been revised and several reported issues have been addressed in #1290 thanks to @ognis1205! -
--include-pathis now automatically set to the value of--workdirif the latter is provided. This ensures that commit parsing works as expected when a different working directory is specified.
Before:
git cliff --workdir my_crate --include-path my_crate
After:
git cliff --workdir my_crate
๐ฆ Better APIโ
The git-cliff library crates (git_cliff & git_cliff_core) has been improved with several new features and enhancements!
git_cliff::runnow returns the generatedgit_cliff_core::changelog::Changelog,git_cliff::write_changeloghelper writes it to a file or stdout,git_cliff::init_configfunction handles config creation,git_cliff::check_new_versionis now public.
Breaking changes:
Changelog::new/Changelog::from_contexttakeConfigby value
Here is how you can create a minimal git-cliff application in Rust:
use clap::Parser;
use git_cliff::args::Opt;
use git_cliff_core::error::Result;
fn main() -> Result<()> {
let args = Opt::parse();
let changelog = git_cliff::run(args.clone())?;
git_cliff::write_changelog(&args, changelog, std::io::stdout())?;
Ok(())
}
๐งฐ Otherโ
- (bump) Write bumped version to stdout even when output config is set (#1307) - (314ff57)
- (args) Group remote-related CLI arguments under REMOTE OPTIONS heading (#1271) - (0b6af12)
- (remote) Expose commits and PRs as streams (#1272) - (b82221a)
- (ci) Stabilize lychee link checking in CI (#1295) - (7ed1db0)
New Contributors โค๏ธโ
- @Lewiscowles1986 made their first contribution in #1226
- @OpenSauce made their first contribution in #1314
- @amd989 made their first contribution in #1283
- @asweet-confluent made their first contribution in #1272
- @linus-skold made their first contribution in #1287
- @simoncdn made their first contribution in #1305
- @haidaraM made their first contribution in #1285
- @ritoban23 made their first contribution in #1271
Any contribution is highly appreciated! See the contribution guidelines for getting started.
Feel free to submit issues and join our Discord / Matrix for discussion!
Follow git-cliff on Twitter & Mastodon to not miss any news!
Support ๐โ
If you liked git-cliff and/or my other projects on GitHub, consider donating to support my open source endeavors.
- ๐ GitHub Sponsors: @orhun
- โ Buy Me A Coffee: https://www.buymeacoffee.com/orhun
Have a fantastic day! โฐ๏ธ