diff --git a/dvc/output/local.py b/dvc/output/local.py
--- a/dvc/output/local.py
+++ b/dvc/output/local.py
@@ -18,6 +18,12 @@ class OutputLOCAL(OutputBase):
     REMOTE = RemoteLOCAL
     sep = os.sep
 
+    def __init__(self, stage, path, *args, **kwargs):
+        if stage and path_isin(path, stage.repo.root_dir):
+            path = relpath(path, stage.wdir)
+
+        super().__init__(stage, path, *args, **kwargs)
+
     def _parse_path(self, remote, path):
         parsed = urlparse(path)
         if parsed.scheme == "remote":

diff --git a/tests/func/test_add.py b/tests/func/test_add.py
--- a/tests/func/test_add.py
+++ b/tests/func/test_add.py
@@ -216,7 +216,7 @@ def test(self):
         self.assertEqual(ret, 0)
 
         d = load_stage_file("bar.dvc")
-        self.assertEqual(d["outs"][0]["path"], bar)
+        self.assertEqual(d["outs"][0]["path"], self.BAR)
 
 
 class TestCmdAdd(TestDvc):
diff --git a/tests/unit/output/test_local.py b/tests/unit/output/test_local.py
--- a/tests/unit/output/test_local.py
+++ b/tests/unit/output/test_local.py
@@ -42,13 +42,28 @@ def test_str_workdir_inside_repo(dvc):
     assert os.path.join("some_folder", "path") == str(output)
 
 
-def test_str_on_absolute_path(dvc):
+def test_str_on_local_absolute_path(dvc):
     stage = Stage(dvc)
 
-    path = os.path.abspath(os.path.join("path", "to", "file"))
-    output = OutputLOCAL(stage, path, cache=False)
+    rel_path = os.path.join("path", "to", "file")
+    abs_path = os.path.abspath(rel_path)
+    output = OutputLOCAL(stage, abs_path, cache=False)
 
-    assert path == str(output)
+    assert output.def_path == rel_path
+    assert output.path_info.fspath == abs_path
+    assert str(output) == rel_path
+
+
+def test_str_on_external_absolute_path(dvc):
+    stage = Stage(dvc)
+
+    rel_path = os.path.join("..", "path", "to", "file")
+    abs_path = os.path.abspath(rel_path)
+    output = OutputLOCAL(stage, abs_path, cache=False)
+
+    assert output.def_path == abs_path
+    assert output.path_info.fspath == abs_path
+    assert str(output) == abs_path
 
 
 class TestGetFilesNumber(TestDvc):

dvc add absolute_path
`~/repo$ dvc add $HOME/repo/file` should realise that the file is not "external" and add it as a relative path rather than absolute.

tests/func/test_add.py::TestAddLocalRemoteFile::test tests/unit/output/test_local.py::test_str_on_local_absolute_path
tests/func/test_add.py::test_add tests/func/test_add.py::test_add_unicode tests/func/test_add.py::test_add_unsupported_file tests/func/test_add.py::test_add_directory tests/func/test_add.py::TestAddDirectoryRecursive::test tests/func/test_add.py::TestAddCmdDirectoryRecursive::test tests/func/test_add.py::TestAddCmdDirectoryRecursive::test_warn_about_large_directories tests/func/test_add.py::TestAddDirectoryWithForwardSlash::test tests/func/test_add.py::test_add_tracked_file tests/func/test_add.py::TestAddDirWithExistingCache::test tests/func/test_add.py::TestAddModifiedDir::test tests/func/test_add.py::test_add_file_in_dir tests/func/test_add.py::TestAddExternalLocalFile::test tests/func/test_add.py::TestCmdAdd::test tests/func/test_add.py::TestDoubleAddUnchanged::test_dir tests/func/test_add.py::TestDoubleAddUnchanged::test_file tests/func/test_add.py::test_should_update_state_entry_for_file_after_add tests/func/test_add.py::test_should_update_state_entry_for_directory_after_add tests/func/test_add.py::TestAddCommit::test tests/func/test_add.py::test_should_collect_dir_cache_only_once tests/func/test_add.py::TestShouldAddDataFromExternalSymlink::test tests/func/test_add.py::TestShouldAddDataFromInternalSymlink::test tests/func/test_add.py::TestShouldPlaceStageInDataDirIfRepositoryBelowSymlink::test tests/func/test_add.py::TestShouldThrowProperExceptionOnCorruptedStageFile::test tests/func/test_add.py::TestAddFilename::test tests/func/test_add.py::test_failed_add_cleanup tests/func/test_add.py::test_should_not_track_git_internal_files tests/func/test_add.py::test_readding_dir_should_not_unprotect_all tests/func/test_add.py::test_should_not_checkout_when_adding_cached_copy tests/func/test_add.py::test_should_relink_on_repeated_add[hardlink-copy-<lambda>] tests/func/test_add.py::test_should_relink_on_repeated_add[symlink-copy-<lambda>] tests/func/test_add.py::test_should_relink_on_repeated_add[copy-hardlink-is_hardlink] tests/func/test_add.py::test_should_relink_on_repeated_add[copy-symlink-is_symlink] tests/func/test_add.py::test_escape_gitignore_entries tests/unit/output/test_local.py::TestOutputLOCAL::test_save_missing tests/unit/output/test_local.py::test_str_workdir_outside_repo tests/unit/output/test_local.py::test_str_workdir_inside_repo tests/unit/output/test_local.py::test_str_on_external_absolute_path tests/unit/output/test_local.py::TestGetFilesNumber::test_return_0_on_no_cache tests/unit/output/test_local.py::TestGetFilesNumber::test_return_1_on_single_file_cache tests/unit/output/test_local.py::TestGetFilesNumber::test_return_multiple_for_dir