/home
我正在尝试对我的目录进行自动备份。理论上,通过在 cronjob 中运行它很简单:
cd /home
git add .
git commit -m "nightly backup"
git push
其中,push 会将更改推送到远程备份服务器。
我遇到的问题是,如果/home
目录中有一个 git repo,例如/home/tom/projects/myproject/.git
。备份任务运行并将所有更改推送到服务器。但是,服务器上任何包含存储库的目录现在都是空白的。
我意识到这一点可以由子模块处理。然而,这有几个缺点:
每个子模块必须向父存储库注册(这可以是自动化的,但这会有点痛苦,递归到每个目录并在每次 cron 运行时添加子模块)
子模块中未提交的更改将不会被备份,这对于备份来说不是理想的行为,我想要所有文件当前的实时快照,无论它们是否在其他地方跟踪
我意识到还有其他工具(例如 rsync)可以执行此操作,但是让 git 跟踪一段时间内的更改会很好。有什么方法可以让 git 将其他存储库视为普通文件(包括它们的 .git 目录!)
解决这个问题的方法是在 cron 中运行类似的内容:
- 递归到所有子目录
- 查找 .git 文件夹
- 将 .git 重命名为其他名称
- 然后运行标准的添加/提交/推送
这可以工作,但需要在任何恢复过程中将所有 .git 文件夹重命名回来。有没有办法在没有这种开销的情况下实现这一目标?
答案1
Git over git 有点疯狂:)
- 尝试将您的存储库添加到 gitignore 目录。
- 添加 cron 脚本命令以在提交之前存档您的存储库。
- (可选)设置自动提交/推送到所有包含的存储库。
恕我直言,1 和 2 对你有好处。
cd /home
tar -zcvf my-gits-backup.tar.gz path/to/git/projects
git add .
git commit -m "nightly backup"
git push
答案2
我还有一堆 git 存储库,并在注销、重新启动或关闭时备份它们同步到我的云。这是您在那里找到的最简单的解决方案。
我也听说过布普(https://github.com/bup/bup),但从未使用过它,所以我无法告诉你它的效果如何。
我自己,我不会使用 git 来备份多个 git 存储库(因为我不需要备份历史记录)我感兴趣的唯一历史记录已经在 git 存储库中了!
答案3
我知道我的评论不是一个非常直接的答案,但是......我建议通过以下方式(或/或)重新组织您的备份方法:
- 拥有一个包含所有子项目的“主要”存储库:我的意思是 /home 的一个存储库。乍一看这可能看起来很疯狂,但这取决于子项目(子目录)的复杂性,并且可能适用于简单且未积极开发的东西。
- 放弃你的想法,用特殊的备份解决方案来维护完整的备份(rsync只是其中之一,而不是万能的)。这是有道理的,因为“为什么需要备份所有与 git 相关的东西?”。最好将其视为架构的更高级别,需要以 git 以外的其他方式进行维护(git 是内在的东西)。我在这里的意思是,如果你的主要原因是“不过如果让 git 跟踪一段时间内的变化就好了“是将更改回滚到某个精确点的能力,那么 Git 是一种开销,而不是您需要的解决方案。使用特殊软件进行差异/增量 + 完整备份(顺便说一句,您可以在其中排除所有“.git”文件夹)是一个正确的方法。