用 tar 打包时让软链接变成实际文件需加 -h(或 --dereference)选项,该选项使 tar 跟随软链接并存入目标文件内容,而非链接本身;硬链接需额外使用 --hard-dereference。

用 tar 打包时让软链接变成它指向的实际文件,关键就是加 -h(或 --dereference)选项。
用 -h 选项打包软链接的真实内容
默认情况下,tar 只记录软链接本身(即一个指向路径的符号),解包后还是软链接。加上 -h 后,tar 会“跟随”软链接,把目标文件的内容真正写进归档包里。
-
tar -zcvhf archive.tgz dir/:压缩并打包dir/,所有软链接都被替换成其指向的源文件 -
tar -cvhf backup.tar /etc/nginx:不压缩,只打包,但软链接全部展开为真实文件 -
tar --dereference -cf project.tar project/:等价写法,语义更清晰
特别注意硬链接和软链接的区别
-h 只影响软链接(symbolic link),对硬链接(hard link)无效。如果也要处理硬链接(即避免重复存储相同 inode 的多个硬链接),需额外加 --hard-dereference:
- 软链接 → 用
-h或--dereference - 硬链接 → 用
--hard-dereference(较少见,一般不需要)
常见误操作与验证方法
打包后不确定是否生效?可以用 tar -tvf 查看归档内容:
- 如果看到的是
lrwxr-xr-x开头的条目,说明软链接没被展开 - 如果看到的是
-rw-r--r--或drwxr-xr-x,且路径是目标文件路径(比如./.git/config而不是./.git -> /path/to/repo/.git),说明-h生效了
典型使用场景
这个功能在以下情况特别有用:
- 备份 Git 仓库时确保
.git目录完整(有些 repo 用软链指向外部.git) - 迁移项目到无软链支持的环境(如某些容器或老旧系统)
- 生成可独立运行的部署包,避免依赖原路径结构

















