···1818 let repository = gix::open(arguments.repository_path)?;
19192020 let mut current_commit = repository.resolve_revspec(&arguments.from)?;
2121- let current_tree = current_commit
2121+ let mut current_tree = current_commit
2222 .tree()
2323 .context("Failed to get tree for initial commit")?;
2424+2525+ if let Some(subtree) = &arguments.subtree {
2626+ let entry = current_tree
2727+ .lookup_entry_by_path(subtree)?
2828+ .expect("sub-tree not found");
2929+ if entry.mode().is_tree() {
3030+ current_tree = repository.find_tree(entry.id())?;
3131+ }
3232+ }
24332534 // Build a set of the entry file names we are interested in.
2635 let mut interested: HashSet<_> = Default::default();
···6978 let parent_commit = repository
7079 .find_commit(parent_id)
7180 .context("Failed to find parent commit")?;
7272- let parent_tree = parent_commit
8181+ let mut parent_tree = parent_commit
7382 .tree()
7483 .context("Failed to retrieve parent tree")?;
8484+8585+ if let Some(subtree) = &arguments.subtree {
8686+ let Some(entry) = parent_tree.lookup_entry_by_path(subtree)? else {
8787+ // The subtree does not exist in this revision. Assume any
8888+ // remaining entries of interest belong to this commit.
8989+ for entry in interested.drain() {
9090+ output(entry.as_bstr(), ¤t_commit)?;
9191+ }
9292+ break;
9393+ };
9494+ if entry.mode().is_tree() {
9595+ parent_tree = repository.find_tree(entry.id())?;
9696+ }
9797+ }
75987699 let mut scanner = EntryScanner::new(current_tree.iter(), parent_tree.iter())?;
77100 while let Some(change) = scanner.next_change()? {