如果我想复制存储库,我会使用它。
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 clone --mirror
fetch
参考规格设置为 +refs/*:refs/*
git config --bool remote.origin.mirror
设置为 true如果您的 git 远程命令后满足这些条件,那么是的,这相当于镜像克隆。
那么,如果我运行
,与“git clone --mirror”一样吗?git remote add --mirror=fetch && git fetch --all
初始化裸存储库后运行
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