Skip to contentSkip to conversation

last-modified: support sparse checkouts

PATCH In review Johannes Schindelin via GitGitGadget 3 participants 3 messages Nov 29, 2025 – Dec 3, 2025

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 last-modified: support sparse checkouts

From: Johannes Schindelin <[email protected]>

In a sparse checkout, a user might want to run last-modified on a directory outside the worktree.

And even in non-sparse checkouts, a user might need to run that command on a directory that does not exist in the worktree.

These use cases should be supported via the -- separator between revision and file arguments, which is even advertised in the documentation. This patch fixes a tiny bug that prevents that from working.

This fixes https://github.com/git-for-windows/git/issues/5978

---
last-modified: support sparse checkouts

Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-2013%2Fdscho%2Flast-modified-vs-sparse-checkouts-v1
Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-2013/dscho/last-modified-vs-sparse-checkouts-v1
Pull-Request: https://github.com/gitgitgadget/git/pull/2013

 builtin/last-modified.c  | 3 ++-
 t/t8020-last-modified.sh | 8 ++++++++
 2 files changed, 10 insertions(+), 1 deletion(-)
builtin/last-modified.c +2 -1
index b0ecbdc540..dc1e229f4d 100644
@@ -525,7 +525,8 @@ int cmd_last_modified(int argc, const char **argv, const char *prefix,
 
 	argc = parse_options(argc, argv, prefix, last_modified_options,
 			     last_modified_usage,
-			     PARSE_OPT_KEEP_ARGV0 | PARSE_OPT_KEEP_UNKNOWN_OPT);
+			     PARSE_OPT_KEEP_ARGV0 | PARSE_OPT_KEEP_UNKNOWN_OPT |
+			     PARSE_OPT_KEEP_DASHDASH);
 
 	repo_config(repo, git_default_config, NULL);
 
t/t8020-last-modified.sh +8 -0
index a4c1114ee2..50f4312f71 100755
@@ -78,6 +78,14 @@ test_expect_success 'last-modified subdir' '
 	EOF
 '
 
+test_expect_success 'last-modified in sparse checkout' '
+	test_when_finished "git sparse-checkout disable" &&
+	git sparse-checkout set b &&
+	check_last_modified -- a <<-\EOF
+	3 a
+	EOF
+'
+
 test_expect_success 'last-modified subdir recursive' '
 	check_last_modified -r a <<-\EOF
 	3 a/b/file

base-commit: 9a2fb147f2c61d0cab52c883e7e26f5b7948e3ed

Signature · 1 line
gitgitgadget
#1 lore raw
Quoted 13 lines · Johannes Schindelin via GitGitGadget

From: Johannes Schindelin <[email protected]>

In a sparse checkout, a user might want to run last-modified on a directory outside the worktree.

And even in non-sparse checkouts, a user might need to run that command on a directory that does not exist in the worktree.

These use cases should be supported via the -- separator between revision and file arguments, which is even advertised in the documentation. This patch fixes a tiny bug that prevents that from working.

builtin/last-modified.c int cmd_last_modified(int argc, const char **argv, const char *prefix, · line 529

Quoted 5 lines
builtin/last-modified.c +2 -1
 	argc = parse_options(argc, argv, prefix, last_modified_options,
 			     last_modified_usage,
-			     PARSE_OPT_KEEP_ARGV0 | PARSE_OPT_KEEP_UNKNOWN_OPT);
+			     PARSE_OPT_KEEP_ARGV0 | PARSE_OPT_KEEP_UNKNOWN_OPT |
+			     PARSE_OPT_KEEP_DASHDASH);

I'm intrigued that this is the only fix that was required.

t/t8020-last-modified.sh test_expect_success 'last-modified subdir' ' · line 84

Quoted 4 lines
t/t8020-last-modified.sh +4 -0
+test_expect_success 'last-modified in sparse checkout' '
+	test_when_finished "git sparse-checkout disable" &&
+	git sparse-checkout set b &&
+	check_last_modified -- a <<-\EOF

Would we expect this to work without the '--'? Should it fail for a directory that exists at HEAD but is outside of the sparse-checkout?

Thanks,
-Stolee

#2 lore raw
Quoted 14 lines · Derrick Stolee
Quoted 12 lines · Johannes Schindelin via GitGitGadget

From: Johannes Schindelin <[email protected]>

In a sparse checkout, a user might want to run last-modified on a directory outside the worktree.

And even in non-sparse checkouts, a user might need to run that command on a directory that does not exist in the worktree.

These use cases should be supported via the -- separator between revision and file arguments, which is even advertised in the documentation. This patch fixes a tiny bug that prevents that from working.

Quoted 7 lines

builtin/last-modified.c int cmd_last_modified(int argc, const char **argv, const char *prefix, · line 529

Quoted 5 lines
builtin/last-modified.c +2 -1
 	argc = parse_options(argc, argv, prefix, last_modified_options,
 			     last_modified_usage,
-			     PARSE_OPT_KEEP_ARGV0 | PARSE_OPT_KEEP_UNKNOWN_OPT);
+			     PARSE_OPT_KEEP_ARGV0 | PARSE_OPT_KEEP_UNKNOWN_OPT |
+			     PARSE_OPT_KEEP_DASHDASH);

I'm intrigued that this is the only fix that was required.

I like it!

Quoted 8 lines

t/t8020-last-modified.sh test_expect_success 'last-modified subdir' ' · line 84

Quoted 4 lines
t/t8020-last-modified.sh +4 -0
+test_expect_success 'last-modified in sparse checkout' '
+	test_when_finished "git sparse-checkout disable" &&
+	git sparse-checkout set b &&
+	check_last_modified -- a <<-\EOF

Would we expect this to work without the '--'? Should it fail for a directory that exists at HEAD but is outside of the sparse-checkout?

I don't think we need to complicate things that much. Arguments after the '--' are handled as pathspecs. If no paths match that pathspec, the output is simply nothing.

Just to demonstrate:

On 'master':

    $ git last-modified a
    fatal: ambiguous argument 'a': unknown revision or path not in the working tree.
    Use '--' to separate paths from revisions, like this:
    'git <command> [<revision>...] -- [<file>...]'
    $ git last-modified -- a
    fatal: ambiguous argument 'a': unknown revision or path not in the working tree.
    Use '--' to separate paths from revisions, like this:
    'git <command> [<revision>...] -- [<file>...]'

With this patch applied:

    $ git last-modified a
    fatal: ambiguous argument 'a': unknown revision or path not in the working tree.
    Use '--' to separate paths from revisions, like this:
    'git <command> [<revision>...] -- [<file>...]'
    $ git last-modified -- a
    $ echo $?
    0

I agree this behavior is better. Thanks for this fix. I approve.

Signature · 2 lines
Cheers,
Toon