如何将Ubuntu 20.04 CLI根服务器纳入GitHub版本控制及解决相关报错
方案合理性评估
直接将完整Ubuntu 20.04根目录提交到GitHub做版本控制的方案不合理,核心原因有三点:
- 适配性差:Git原生面向文本类代码/配置文件设计,根目录下包含大量虚拟运行时文件(
/proc、/sys、/dev)、临时文件(/tmp)、大体积二进制文件、日志缓存、动态变化的业务数据,不仅会导致仓库体积极速膨胀、提交/拉取效率极低,还会触发GitHub的仓库大小限制(普通公开仓库单库上限5GB)。 - 安全风险极高:全根目录提交极易误传
/etc/shadow、SSH私钥、服务密钥、数据库密码等敏感信息,一旦推送到公仓会直接导致服务器完全失陷。 - 恢复可用性低:Git无法完整保留Linux系统文件的权限、特殊属性、软链接关联、分区表信息,即使后续从仓库拉取全量文件,也无法正常恢复系统运行。
更适合的服务器版本控制/备份方案
根据需求不同可以选择两类方案:
配置文件版本控制(推荐,符合版本控制的核心需求)
仅跟踪你手动修改的配置类文件即可,不需要全系统同步:
- 可以使用专门的
etckeeper工具,默认基于Git实现/etc目录的版本管理,自动适配系统文件权限、自动过滤敏感文件、自动在配置修改时提交记录,完全满足系统配置回溯的需求。 - 如果要跟踪自定义服务的配置,可单独给服务的配置目录创建Git仓库,搭配
.gitignore过滤日志、缓存、运行时文件,仅提交配置代码即可。
整机备份方案
如果需要整机灾备恢复,不要用Git,选择以下方案:
- 用
rsync做增量同步,将系统文件备份到外接存储或独立备份服务器,可完整保留文件权限与属性。 - 整机托管在云服务商的话直接使用服务商提供的磁盘快照功能,支持分钟级整机备份与恢复,效率远高于Git。
- 物理服务器可以用
dd命令生成整块磁盘的镜像文件,存储到离线设备中。
现有报错的解决方法
两个报错的根源和修复方式如下:
error: src refspec main does not match any
该报错是因为本地执行git init后,没有执行任何提交操作,本地不存在main分支的提交记录,没有内容可以推送到远端。如果要推送需要先执行git add <指定文件>、git commit -m "提交说明"之后再执行push命令,禁止在根目录执行git add .操作,避免全量文件被加入暂存区。fatal: destination path '.' already exists and is not an empty directorygit clone默认仅支持克隆到空目录,如果要将现有本地目录和远端Git仓库绑定,不需要执行clone,直接在目标目录执行以下命令即可:
git init git remote add origin git@github.com:hero/128GB.git git pull origin main --allow-unrelated-histories
执行完成后本地目录就和远端仓库完成了关联,同样不建议在根目录执行以上操作。
后续操作建议
放弃用Git同步全根目录的方案,改为使用etckeeper跟踪系统配置、搭配整机快照/rsync做灾备即可,完全可以满足服务器管理的需求。
内容的提问来源于stack exchange,提问作者Tupac Shakur
相关产品推荐
相关产品推荐

