`git remote add --mirror=fetch` 会与 `git clone --mirror` 制作相同的仓库吗?

问题描述 投票:0回答:1

如果我想复制存储库,我会使用它。

git clone --mirror $SRC $DST

但是此命令要求

$DST
处不存在存储库。一般来说没问题,但如果我想从多个进程同时发出 Git 命令,可能会导致一些竞争条件,因为在执行命令之前不存在可锁定的文件对象。

如果我只是想跳过

$DST
的存在测试,我想我可以做

mkdir -p $DST
cd $DST
git init --bare 
git remote add origin --mirror-=fetch $SRC 2>/dev/null || true
git remote update

这会与

git clone --mirror $SRC $DST
生成完全相同的仓库吗?

git concurrency git-clone mirror git-mirror
1个回答
2
投票

如果您查看对 git clone --mirror

 进行的  测试,您会看到镜像克隆具有:

  • a
    fetch
    参考规格设置为
    +refs/*:refs/*
  • a
    git config --bool remote.origin.mirror
    设置为 true

如果您的 git 远程命令后满足这些条件,那么是的,这相当于镜像克隆。


那么,如果我运行

git remote add --mirror=fetch && git fetch --all
,与“git clone --mirror”一样吗?

初始化裸存储库后运行

git remote add --mirror=fetch && git fetch --all
几乎
git clone --mirror
相同。
但不完全是。

当您使用

git remote add --mirror=fetch
时,Git 将 fetch refspec 配置为
+refs/*:refs/*
,这确实反映了
git clone --mirror
在从源存储库获取所有分支、标签和其他引用方面的行为。通过在远程添加之后执行
git fetch --all
,您将指示 Git 从所有远程设备中获取数据,在本上下文中,这意味着从您刚刚添加的源存储库中获取所有数据。

git clone --mirror
自动将配置
remote.<remote>.mirror
设置为
true
。该配置对于将存储库视为真正的镜像至关重要,不仅影响获取操作,还影响推送行为。它确保存储库可以作为获取和推送更改的完整镜像。

这意味着,虽然

git remote add --mirror=fetch && git fetch --all
成功将源存储库的内容镜像到本地存储库,但要实现与
git clone --mirror
完全等效,您需要手动设置
remote.<remote>.mirror
配置:

git config --bool remote.origin.mirror true
© www.soinside.com 2019 - 2024. All rights reserved.