diff --git a/t/t1010-mktree.sh b/t/t1010-mktree.sh
index cecba55d451f2d..42f72acabc3268 100755
--- a/t/t1010-mktree.sh
+++ b/t/t1010-mktree.sh
@@ -117,4 +117,77 @@ test_expect_success PIPE 'mktree --batch survives a concurrent repack retiring a
)
'
+test_expect_success 'mktree --batch writes one tree per input block' '
+ {
+ cat top &&
+ echo &&
+ cat top.withsub
+ } >input &&
+ cat tree tree.withsub >expect &&
+ git mktree --batch actual &&
+ test_cmp expect actual
+'
+
+test_expect_success 'mktree --batch ignores a trailing blank line' '
+ {
+ cat top &&
+ echo &&
+ cat top.withsub &&
+ echo
+ } >input &&
+ cat tree tree.withsub >expect &&
+ git mktree --batch actual &&
+ test_cmp expect actual
+'
+
+test_expect_success 'mktree --batch: two blank lines give an empty tree' '
+ {
+ cat top &&
+ echo &&
+ echo &&
+ cat top.withsub
+ } >input &&
+ {
+ cat tree &&
+ git mktree expect &&
+ git mktree --batch actual &&
+ test_cmp expect actual
+'
+
+test_expect_success 'mktree rejects a blank line without --batch' '
+ {
+ cat top &&
+ echo &&
+ cat top.withsub
+ } >input &&
+ test_must_fail git mktree err &&
+ test_grep "blank line only valid in batch mode" err
+'
+
+test_expect_success 'mktree --batch -z reads NUL-terminated input' '
+ {
+ git ls-tree -z $(cat tree) &&
+ printf "\0" &&
+ git ls-tree -z $(cat tree.withsub)
+ } >input &&
+ cat tree tree.withsub >expect &&
+ git mktree --batch -z actual &&
+ test_cmp expect actual
+'
+
+test_expect_success 'mktree --batch stops at a tree with a missing object' '
+ missing=$(test_oid deadbeef) &&
+ {
+ cat top &&
+ echo &&
+ printf "100644 blob %s\tmissing\n" "$missing" &&
+ echo &&
+ cat top.withsub
+ } >input &&
+ test_must_fail git mktree --batch actual &&
+ test_cmp tree actual
+'
+
test_done