【问题标题】:Cloning back a mirrored local Git repository克隆一个镜像的本地 Git 存储库
【发布时间】:2021-09-18 22:20:49
【问题描述】:

我已镜像 (clone --mirror) 一个没有远程引用的本地存储库,仅用于备份目的。我注意到备份的 repo 有一个 'packed-refs' 文件,里面有 local refs。

当我尝试将其克隆回来时,我得到了相同的“打包引用”文件,其中包含远程引用,例如 remotes/origin/heads/... 而不是本地引用。然后,我必须检查每个 refs 以获得本地 refs。

有没有办法,也许是一些clone 选项,能够直接恢复本地引用?

【问题讨论】:

  • packed-refs 文件与 unpacked refs 并没有什么特别之处:git pack-refs 将 unpacked refs 转换为packed refs,所以这一切都很正常。某些特定 ref 的未打包实例会覆盖已打包条目。 --mirror 所做的只是 (a) 进行裸克隆和 (b) 将默认 fetch refspec 设置为 +refs/*:refs/*
  • 我在你的问题中缺少的是你所说的“克隆回来”的意思。你的意思是:原来的repo确实被破坏了,你现在想用镜像来恢复原来的?
  • --mirror 克隆它。 --mirror 指示 Git 将所有远程引用复制为本地引用。如果没有镜像选项,远程引用将变为远程引用。
  • @torek 是的,我只是想从镜像的仓库中恢复被破坏的仓库。 @knittl 如果我使用--mirror,即使我想恢复被破坏的仓库,我也会得到一个没有工作树的裸仓库,所以我无法使用它。
  • 我认为使用clone 命令恢复一个裸露的(即镜像的)repo 总是会将引用解析为远程的,即使它们是本地的。然后,您需要检查远程 refs 以便将它们获取到本地或将 'refs/remotes/origin/branch' 修改为 'refs/heads/branch' 到打包的 refs 文件中。是否有一个选项可以阻止 clone 命令将引用解析为远程引用?

标签: git clone mirror


【解决方案1】:

如果您从某个现有克隆创建了一个裸克隆,并且现有克隆已被销毁(或者您可能正在新的服务器设置上重新创建它),您有两种选择:

  • 将新的裸克隆创建为空克隆,然后使用git push --mirror 来自备份/镜像克隆新克隆,或
  • 使用现有裸克隆中的git clone --mirror 来创建新的裸克隆,然后可以选择删除在新裸克隆中创建的远程。

例如,假设这里的提示ec$是在ec.example.com上的现有镜像克隆上,而ns$是新服务器上的提示ns.example.com

ns$ cd /git && mkdir restored && cd restored && git init --bare
[git messages happen here]

ec$ git push --mirror ssh://ns.example.com/git/restored

git push --mirror/git/restored 中设置新服务器的克隆。

或者:

ns$ cd /git
ns$ git clone --mirror ssh://ec.example.com/~user/backup/the-mirror restored
[git messages happen here]

ns$ cd restored
ns$ git remote remove origin

git remote remove 步骤是可选的;它清理了显示恢复的裸镜像克隆来自ec.example.com/~user/backup/the-mirror 的痕迹。由于这些跟踪仅对最初实际登录到服务器的任何人可见,因此这并不是真正必需,但无论出于何种原因,您都可能会喜欢它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-10-16
    • 1970-01-01
    • 2013-02-28
    • 2013-08-01
    • 2017-04-05
    • 1970-01-01
    • 1970-01-01
    • 2013-07-14
    相关资源
    最近更新 更多