diff --git a/dvc/output.py b/dvc/output.py
--- a/dvc/output.py
+++ b/dvc/output.py
@@ -583,6 +583,7 @@ def _checkout(self, *args, **kwargs):
         from dvc_data.checkout import CheckoutError as _CheckoutError
         from dvc_data.checkout import LinkError, PromptError
 
+        kwargs.setdefault("ignore", self.dvcignore)
         try:
             return checkout(*args, **kwargs)
         except PromptError as exc:
@@ -627,7 +628,6 @@ def commit(self, filter_info=None):
                 obj,
                 self.odb,
                 relink=True,
-                ignore=self.dvcignore,
                 state=self.repo.state,
                 prompt=prompt.confirm,
             )

#4344 and this issue are related to staging in dvc-data.
diff --git a/tests/func/test_ignore.py b/tests/func/test_ignore.py
--- a/tests/func/test_ignore.py
+++ b/tests/func/test_ignore.py
@@ -418,3 +418,27 @@ def test_run_dvcignored_dep(tmp_dir, dvc, run_copy):
     tmp_dir.gen({".dvcignore": "dir\n", "dir": {"foo": "foo"}})
     run_copy(os.path.join("dir", "foo"), "bar", name="copy-foo-to-bar")
     assert (tmp_dir / "bar").read_text() == "foo"
+
+
+def test_pull_ignore(tmp_dir, dvc, local_cloud):
+    from dvc.utils.fs import remove
+
+    tmp_dir.dvc_gen(
+        {
+            ".dvcignore": "data/processed/",
+            "data": {"foo": "foo", "processed": {"bar": "bar"}},
+        }
+    )
+    tmp_dir.add_remote(config=local_cloud.config)
+    dvc.add("data")
+    dvc.push()
+
+    foo_path = tmp_dir / "data" / "foo"
+    foo_path.unlink()
+    assert not foo_path.exists()
+
+    remove(tmp_dir / ".dvc/cache")
+    dvc.pull()
+
+    assert foo_path.exists()
+    assert foo_path.read_text() == "foo"

checkout/pull: dvcignored contents are removed on checkout
```bash
cd "$(mktemp -d)"
dvc init --no-scm
dvc remote add -d local "$(mktemp -d)"
mkdir -p data/processed
echo "foo" > data/foo
echo "bar" > data/processed/bar
echo "data/processed/" >> .dvcignore
dvc add data
dvc push
rm -rf .dvc/cache data/foo
dvc pull | tee
```

This is a regression introduced in b349b39d6266a28705b03b1b06e5c0cf98a9080d (see #5812), which was released in [2.2.0](https://github.com/iterative/dvc/releases/tag/2.2.0) and is present since then.

tests/func/test_ignore.py::test_pull_ignore
tests/func/test_ignore.py::test_ignore[ignored] tests/func/test_ignore.py::test_ignore[\u0442\u0435\u0441\u0442] tests/func/test_ignore.py::test_rename_ignored_file tests/func/test_ignore.py::test_rename_file tests/func/test_ignore.py::test_remove_ignored_file tests/func/test_ignore.py::test_remove_file tests/func/test_ignore.py::test_dvcignore_in_out_dir tests/func/test_ignore.py::test_ignore_collecting_dvcignores[dir] tests/func/test_ignore.py::test_ignore_collecting_dvcignores[dir/subdir] tests/func/test_ignore.py::test_ignore_on_branch tests/func/test_ignore.py::test_match_nested tests/func/test_ignore.py::test_ignore_external tests/func/test_ignore.py::test_ignore_resurface_subrepo tests/func/test_ignore.py::test_ignore_blank_line tests/func/test_ignore.py::test_ignore_file_in_parent_path[data_struct0-pattern_list0-result_set0] tests/func/test_ignore.py::test_ignore_file_in_parent_path[data_struct1-pattern_list1-result_set1] tests/func/test_ignore.py::test_ignore_file_in_parent_path[data_struct2-pattern_list2-result_set2] tests/func/test_ignore.py::test_ignore_sub_directory tests/func/test_ignore.py::test_ignore_directory tests/func/test_ignore.py::test_multi_ignore_file tests/func/test_ignore.py::test_pattern_trie_fs tests/func/test_ignore.py::test_ignore_in_added_dir tests/func/test_ignore.py::test_ignored_output tests/func/test_ignore.py::test_ignored_output_nested tests/func/test_ignore.py::test_run_dvcignored_dep