diff --git a/.github/fixtures/test-limit-commits/cliff.toml b/.github/fixtures/test-limit-commits/cliff.toml
new file mode 100644
index 0000000000..39b12ff123
--- /dev/null
+++ b/.github/fixtures/test-limit-commits/cliff.toml
@@ -0,0 +1,30 @@
+[changelog]
+# changelog header
+header = """
+# Changelog\n
+All notable changes to this project will be documented in this file.\n
+"""
+# template for the changelog body
+# https://tera.netlify.app/docs/#introduction
+body = """
+{% if version %}\
+ ## [{{ version | trim_start_matches(pat="v") }}] - {{ timestamp | date(format="%Y-%m-%d") }}
+{% else %}\
+ ## [unreleased]
+{% endif %}\
+{% for group, commits in commits | group_by(attribute="group") %}
+ ### {{ group | upper_first }}
+ {% for commit in commits %}
+ - {% if commit.breaking %}[**breaking**] {% endif %}{{ commit.message | upper_first }}\
+ {% endfor %}
+{% endfor %}\n
+"""
+# remove the leading and trailing whitespace from the template
+trim = true
+# changelog footer
+footer = """
+
+"""
+
+[git]
+limit_commits = 2
diff --git a/.github/fixtures/test-limit-commits/commit.sh b/.github/fixtures/test-limit-commits/commit.sh
new file mode 100755
index 0000000000..958ce00ba9
--- /dev/null
+++ b/.github/fixtures/test-limit-commits/commit.sh
@@ -0,0 +1,8 @@
+#!/usr/bin/env bash
+set -e
+
+GIT_COMMITTER_DATE="2022-04-06 01:25:08" git commit --allow-empty -m "Initial commit"
+GIT_COMMITTER_DATE="2022-04-06 01:25:09" git commit --allow-empty -m "feat: add feature 1"
+GIT_COMMITTER_DATE="2022-04-06 01:25:10" git commit --allow-empty -m "fix: fix feature 1 (#1)"
+GIT_COMMITTER_DATE="2022-04-06 01:25:11" git commit --allow-empty -m "refactor: move classes"
+git tag v0.1.0
diff --git a/.github/fixtures/test-limit-commits/expected.md b/.github/fixtures/test-limit-commits/expected.md
new file mode 100644
index 0000000000..55ee3273f5
--- /dev/null
+++ b/.github/fixtures/test-limit-commits/expected.md
@@ -0,0 +1,15 @@
+# Changelog
+
+All notable changes to this project will be documented in this file.
+
+## [0.1.0] - 2022-04-05
+
+### Fix
+
+- Fix feature 1 (#1)
+
+### Refactor
+
+- Move classes
+
+
diff --git a/README.md b/README.md
index 6dac923c59..f521fde7df 100644
--- a/README.md
+++ b/README.md
@@ -469,6 +469,7 @@ link_parsers = [
{ pattern = "#(\\d+)", href = "https://github.com/orhun/git-cliff/issues/$1"},
{ pattern = "RFC(\\d+)", text = "ietf-rfc$1", href = "https://datatracker.ietf.org/doc/html/rfc$1"},
]
+limit_commits = 42
```
#### conventional_commits
@@ -652,6 +653,12 @@ Examples:
- `{ pattern = "RFC(\\d+)", text = "ietf-rfc$1", href = "https://datatracker.ietf.org/doc/html/rfc$1"}`,
- Extract mentions of IETF RFCs and generate URLs linking to them. It also rewrites the text as "ietf-rfc...".
+#### limit_commits
+
+`limit_commits` is a **optional** positive integer number that limits the number of included commits in the generated changelog.
+
+`limit_commits` is not part of the default configuration.
+
## Project Integration
### Rust
@@ -1018,6 +1025,38 @@ All notable changes to this project will be documented in this file.
+#### [Limited Commits](./examples/limitedcommits.toml)
+
+
+ Raw Output
+
+```
+## [unreleased]
+### Feat
+- Support multiple file formats
+- Use cache while fetching pages
+
+## [1.0.1] - 2021-07-18
+### Chore
+- Add release script
+```
+
+
+
+
+ Rendered Output
+
+## [unreleased]
+### Feat
+- Support multiple file formats
+- Use cache while fetching pages
+
+## [1.0.1] - 2021-07-18
+### Chore
+- Add release script
+
+
+
#### [Detailed](./examples/detailed.toml)
diff --git a/config/cliff.toml b/config/cliff.toml
index a4c50a0e74..33586805d3 100644
--- a/config/cliff.toml
+++ b/config/cliff.toml
@@ -66,3 +66,5 @@ ignore_tags = ""
date_order = false
# sort the commits inside sections by oldest/newest order
sort_commits = "oldest"
+# limit the number of commits included in the changelog.
+# limit_commits = 42
diff --git a/examples/limitedcommits.toml b/examples/limitedcommits.toml
new file mode 100644
index 0000000000..3a4632e161
--- /dev/null
+++ b/examples/limitedcommits.toml
@@ -0,0 +1,21 @@
+# configuration file for git-cliff (0.1.0)
+
+[changelog]
+# template for the changelog body
+# https://tera.netlify.app/docs/#introduction
+body = """
+{% if version %}\
+ ## [{{ version | trim_start_matches(pat="v") }}] - {{ timestamp | date(format="%Y-%m-%d") }}\
+{% else %}\
+ ## [unreleased]\
+{% endif %}\
+{% for group, commits in commits | group_by(attribute="group") %}
+ ### {{ group | upper_first }}
+ {% for commit in commits %}\
+ - {% if commit.breaking %}[**breaking**] {% endif %}{{ commit.message | upper_first }}
+ {% endfor %}\
+{% endfor %}\n
+"""
+
+[git]
+limit_commits = 3
diff --git a/git-cliff-core/src/config.rs b/git-cliff-core/src/config.rs
index ca29cfdefb..8fc65af684 100644
--- a/git-cliff-core/src/config.rs
+++ b/git-cliff-core/src/config.rs
@@ -69,6 +69,8 @@ pub struct GitConfig {
pub date_order: Option,
/// Sorting of the commits inside sections.
pub sort_commits: Option,
+ /// Limit the number of commits included in the changelog.
+ pub limit_commits: Option,
}
/// Parser for grouping commits.
diff --git a/git-cliff-core/tests/integration_test.rs b/git-cliff-core/tests/integration_test.rs
index d9e77a4361..d449f36797 100644
--- a/git-cliff-core/tests/integration_test.rs
+++ b/git-cliff-core/tests/integration_test.rs
@@ -91,6 +91,7 @@ fn generate_changelog() -> Result<()> {
text: Some(String::from("$1")),
},
]),
+ limit_commits: None,
};
let releases = vec![
diff --git a/git-cliff/src/changelog.rs b/git-cliff/src/changelog.rs
index 39ce6f3611..9b0cce6850 100644
--- a/git-cliff/src/changelog.rs
+++ b/git-cliff/src/changelog.rs
@@ -265,6 +265,7 @@ mod test {
date_order: Some(false),
sort_commits: Some(String::from("oldest")),
link_parsers: None,
+ limit_commits: None,
},
};
let test_release = Release {
diff --git a/git-cliff/src/lib.rs b/git-cliff/src/lib.rs
index 467bbaf558..13ea4f5370 100644
--- a/git-cliff/src/lib.rs
+++ b/git-cliff/src/lib.rs
@@ -217,8 +217,11 @@ pub fn run(mut args: Opt) -> Result<()> {
}
}
}
- let commits =
+ let mut commits =
repository.commits(commit_range, args.include_path, args.exclude_path)?;
+ if let Some(commit_limit_value) = config.git.limit_commits {
+ commits = commits.drain(..commit_limit_value).collect();
+ }
// Update tags.
if let Some(tag) = args.tag {