【发布时间】:2023-03-09 23:26:01
【问题描述】:
如何确定自上一个 git 包创建以来是否已提交更改,而无需创建工作存储库、循环遍历每个分支并记录每个头部修订?
我发现 GIT 的不足之处之一是在企业中使用适当的备份支持。企业与开源开发的不同之处在于始终存在 1) 权威存储库和 2) 处理大量数据的备份系统。因此有动机 1) 非常频繁地备份和 2) 仅在有新更改时运行备份过程。我的问题是找到#2 的解决方案。
我正在使用git bundle 创建我的档案,但我没有找到确定的方法来确定自上次备份以来是否已提交新更改。
我一直在尝试寻找git rev-list 的选项组合,以列出自上次捆绑以来的新提交 ID,但没有成功。对该主题的查询显示了一个非常漂亮的backup script,使用以下代码编写:
git -C "${path}" rev-parse --short=10 HEAD
使用提交 ID 标记捆绑包。该解决方案不足以描述 git 存储库的快照,因为其他分支可能已更新,而上游存储库的 HEAD 修订版未更改。
我查看过使用--max-age=<lastbackup epoch>,但很快发现开发人员可以在备份运行后推送较旧的更改,并且由于提交的日期没有改变,结果是它们更旧比上次备份日期晚,因此不会触发备份。
到目前为止我最好的方法是:
git -C ${repo} rev-list -a --branches ${prev_commit}..HEAD
它确实从其他分支捕获新修订,但即使在对 HEAD 进行了更新的提交后,仍会继续报告其他分支的修订。
我还没有开始研究增量备份,但我已经看到,为了验证一个,当我更喜欢只在我们的服务器上维护裸存储库时,我需要创建和管理一个工作存储库。
我还要注意,我没有找到 git branch 的选项来删除“*”,所以它只会给我一个干净的脚本分支列表。
其他企业如何备份其存储库?
【问题讨论】:
-
您使用的是 GitHub 或 Bitbucket 等 Git 提供程序吗?这两个都在幕后备份您的数据 AFAIK。
-
不评论备份策略,我会注意到
git rev-list是错误的工具。使用git for-each-ref获取部分或全部引用的当前值。 -
@TimBiegeleisen 不能使用服务提供商。想想企业、IP 等。
-
@torek 这看起来不错,它也捕获标签吗?
-
@btpw:
git for-each-ref对所有引用(分支、标签、存储、注释、远程跟踪分支、来自过滤器分支的refs/original/等)或您指定的引用进行操作。如果您想要标签,请在refs/tags上运行它。详细阅读文档;对于标签,您可能不仅需要标签对象,还需要标签对象的非标签目标对象 ID。
标签: git version-control backups