def link_node(abs_src: str, abs_dest: str, force: bool=False):
    """Sync source node (file / dir) to destination path using hard links."""
    dest_parent_dir = split(abs_dest)[0]
    if not isdir(dest_parent_dir):
        # exist_ok=True in case of concurrent creation of the same
        # parent dir
        os.makedirs(dest_parent_dir, exist_ok=True)
    if isfile(abs_src):
        # sync file by linking it to dest
        link_func(abs_src, abs_dest, force)
    elif isdir(abs_src):
        # sync dir by recursively linking files under it to dest
        shutil.copytree(abs_src, abs_dest,
                        copy_function=functools.partial(link_func,
                                                        force=force),
                        ignore=shutil.ignore_patterns('.git'))
    else:
        raise FileNotFoundError(abs_src)