我想用后台作业镜像一些git存储库。 git clone --mirror
和git remote update
不会保留通过强制推送未引用的对象,但我想保留那些以防万一。有没有工具来执行安全的git镜像?
答案 0 :(得分:3)
虽然没有shell脚本会很繁琐,但是如果你有权访问远程存储库那么你可以执行:
git fsck --lost-found
这将列出未引用的提交,然后您可以为每个提交创建一个分支:
git branch <branch-for-commit> <commit>
此时没有任何未引用的内容,克隆不会gc /丢失任何内容。之后,如果您选择,可以删除分支,如Delete Branches
像这样:
git fsck --lost-found | \
grep dangling | \
awk '{ system ("git branch" " br-" $3 " " $3); }'
保留悬空提交和blob。然后,在克隆之后,
git branch -a | grep "br-" | xargs git branch -D
答案 1 :(得分:3)
重新阅读问题和提供的答案后,我确信我误解了海报的意图。
现在我认为需要的是在目标存储库中启用the reflog,方法是将core.logAllRefUpdates
设置为true
,并可能调整控制reflog过期策略的相关参数(grep) git-config
manual page世界“reflog”)。这将记录所有“激烈”的refs重新定位,允许回滚强制推送等。
请注意,仍然唯一真正的防范,比如你说,“黑客攻击”或任何其他类型的损失是保护异地备份,所以我在第一个答案中提出的建议,我认为,仍然坚持。
答案 2 :(得分:1)
这几乎是一个安全问题。如果您不小心推送了密码或其他内容,则可以修改您的提交并强制推送新提交。之后git将不允许任何访问第一次提交。
如果您确实需要这些提交,则需要访问文件系统并使用rsync
之类的内容来获取所有内容。 - 但请注意git不时会进行一些垃圾收集,因此旧的未引用的提交实际上会丢失。
答案 3 :(得分:1)
我认为您可以使用两阶段备份:
git fetch <remote> +refs/*:refs/*
更新裸镜像存储库。
git gc
可能会“正常化”其内容。
rdiff-backup
结果到另一个目录,该目录将包含最后一个备份版本以及一组二进制差异文件,可用于重建任何以前的备份。
通过这种方式,您可以获得备份快照的版本化历史记录。由于rdiff-backups
允许丢弃旧快照,因此您可以只记录您认为合适的快照。
缺点是浪费磁盘空间:
rdiff-backup
将创建源目录的真实副本;不会共享任何文件。--rsyncable
程序的gzip
命令行选项,因此rdiff-backup
生成的增量可能很大。另一方面,在一个典型的Git repo中,任何包文件都应该只被追加,而不是重写,所以我可能会在这里咆哮错误的树。答案 4 :(得分:1)
如果您正在使用您控制的仓库,则gc
config items可以控制被删除的内容的各个方面以及何时删除;只要您愿意,git remote update
(以及其他所有内容)将保留未引用的对象。具有管理访问权限的任何人都可以通过标记它们来发布未引用的对象。
所以要安全地镜像一个repo,如果你对它进行了管理控制,只需设置一个钩子来将传入的推送转发到一个永不过期的备份仓库。否则,键入收到提交通知将确保您能够记住可能所见过的所有内容。
答案 5 :(得分:1)
Methinks其中一位评论者说得对:rsync或同等学历是你唯一的朋友,不论它是不是一个选择,例如Github上。
看到这个(不可否认的老)线程:
http://kerneltrap.org/mailarchive/git/2007/8/28/256180/thread
引用其中一条消息:
它与Linux开发实践无关。有 我们不提取钩子的根本原因:
他们不是存储库的一部分;看看吧 .gitattributes-in-the-index-but-not-worktree问题找出原因,
它是私有数据,就像配置一样。客户端否 业务阅读它们,更不用说获取它们了,
如果你在不同的机器上有钩子,很可能你需要一个 更新钩子的机制...这自然意味着把 挂钩进入自己的分支。
可能有更多的理由不允许这样的东西取物 钩。
所以......如果你想在多个地方部署它们,把钩子放在他们自己的仓库中是一个很好的解决方案,但除此之外,你知道各种各样的物体的情况并不多。在一个回购...
(该链接的信用额转到:https://stackoverflow.com/a/6154010/417194)
特别是对于github,可能是github-services或web hook的解决方法。