我使用命令<{p>}将https://github.com/boostorg/boost.git镜像到我自己的存储库
git clone --recursive https://github.com/boostorg/boost.git
cd boost
git push --mirror 'URLOfMyOwnRepo'
以镜像所有子模块。但是,它没有达到我预期的效果。
基本上我想做的是N-to-1镜像,所以我可以在不同的分支/标签中查看我自己的回购源。
我试过了:
git clone --mirror --recursive
和
git submodule init
git submodule sync
git submodule update --init --recursive
即使我在本地计算机上安装了这些子模块,我仍然无法将它们镜像到我的存储库。
答案 0 :(得分:0)
我只是经历了同样的经历,在从github递归克隆boost之后,陷入了困境。
最后,我创建了以下bash脚本以跳入每个子模块文件夹,并将镜像手动推送到我的私有gitlab存储库。然后,当我尝试从我的私有gitlab进行git克隆时,主仓库似乎在每个子模块的新URL上找不到其他配置。
#!/bin/bash
# This file is meant to help a user mirror the submodule-rich github repo 'boost' on our private gitlab
# start in boost root directory of boost cloned with:
# git clone --recursive https://github.com/boostorg/boost.git
myhost=example.com
git submodule status | awk '{print $2}' > boost_git_submodules_list.txt
while read line; do
cd $line
module=`cut -d'/' -f2 <<< $line`
echo "git push --mirror git@$myhost:boostorg/$module.git"
git push --mirror git@$myhost:boostorg/$module.git
cd -
done < boost_git_submodules_list.txt
需要一些时间,并且在推送时会有一些破碎的引用,但是我希望这会有所帮助!
答案 1 :(得分:0)
这种情况适用于Boost库:
不要在这方面引用我,但我认为这是历史性的。过去有SVN,我隐约记得这些库是通过 symlink 链接的。如今,分层布局已变得简单,所有库都位于https://github.com/boostorg/下,并实现为https://github.com/boostorg/boost/中的子模块。 您可以通过查看.gitmodules来查看:
url = ../smart_ptr.git
url = ../accumulators.git
等 映射到
boost -> https://github.com/boostorg/boost/
[submodule "smart_ptr"] in libs/smart_ptr via https://github.com/boostorg/boost/../smart_ptr.git
boost -> https://github.com/boostorg/boost/
[submodule "accumulators"] in libs/accumulators via https://github.com/boostorg/boost/../accumulators.git
您要做的唯一复制就是以相同的方式设置本地镜像存储库。当然,有一些流浪猫,例如“ numeric_conversion” ,“ disjoint_sets” 和“ ublas” ,它们映射到 libs /数字或其他目录。而且,这将来可能会改变。
我采用了 neonTTY 的方法,并针对我的用例进行了修改,并修复了“破碎的引用”。我将此用于本地gentoo ebuild恶作剧。
更改:
代码:
#!/bin/bash
# Replicate a local copy of the boost git repositories.
# The current pwd is the root for the hierarchy of boost repositories
# from https://github.com/boostorg/ and https://github.com/boostorg/boost.git
# is the root of your local boost mirror.
# Jedzia (p) 2020, EvePanix
# based on neonTTY's script via
# https://stackoverflow.com/a/55856059/1530424 on Apr 25 '19
git clone https://github.com/boostorg/boost.git boost.git
cd boost.git
git submodule status | awk '{print $2}' > ../boost_git_submodules_list.txt
cd ..
while read line; do
module=`cut -d'/' -f2 <<< $line`
if [ $module == *"libs/numeric"* ] || [ $module == "numeric" ]; then
echo "skip $module.git"
else
echo "git clone https://github.com/boostorg/$module.git"
git clone https://github.com/boostorg/$module.git $module.git
fi
done < boost_git_submodules_list.txt
git clone https://github.com/boostorg/numeric_conversion.git numeric_conversion.git
git clone https://github.com/boostorg/interval.git interval.git
git clone https://github.com/boostorg/odeint.git odeint.git
git clone https://github.com/boostorg/ublas.git ublas.git
git clone https://github.com/boostorg/disjoint_sets.git disjoint_sets.git
之后,您只需运行git clone --recursive /path/where/you/started/the/script/boost.git
即可正确引用子模块。
P.S .:顺便说一句。为什么对OP(@zdunker)来说这种方法不起作用,是因为您没有对 boost.git 根目录的写权限。这没有任何意义,因为您希望自己拥有一个经过深度调制的存储库副本。因此,您还需要将子模块作为本地副本。不幸的是,这也给您带来了跟踪所有更改以及上游更改的负担。欢迎使用存储库维护人员的生活:)使用良好的文档,并保持准确,尤其是当您进行的不仅仅是简单的更改并且在不同的位置。这会很快变得毛茸茸且令人困惑。