Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将Git存储库和子模块镜像到脱机源_Git - Fatal编程技术网

将Git存储库和子模块镜像到脱机源

将Git存储库和子模块镜像到脱机源,git,Git,因此,我意识到也有类似的问题,但它们似乎都没有回答如何将存储库镜像到脱机位置的问题,而不必在超级项目外部手动组织子模块。大多数问题都是关于“在线”镜像或不带子模块的离线镜像 我的第一个想法是为我的超级项目创建一个镜像,但是由于repo是空的,所以不能运行git子模块更新 现在,我知道在这种情况下,.gitmodules使用相对路径而不是绝对路径是有好处的,我们已经这样做了 但我仍然不太明白,拥有超级项目及其所有子模块镜像的最佳方式是什么 我们的项目由一个存储库组成,其中包含许多子模块(~50个,

因此,我意识到也有类似的问题,但它们似乎都没有回答如何将存储库镜像到脱机位置的问题,而不必在超级项目外部手动组织子模块。大多数问题都是关于“在线”镜像或不带子模块的离线镜像

我的第一个想法是为我的超级项目创建一个镜像,但是由于repo是空的,所以不能运行
git子模块更新

现在,我知道在这种情况下,
.gitmodules
使用相对路径而不是绝对路径是有好处的,我们已经这样做了

但我仍然不太明白,拥有超级项目及其所有子模块镜像的最佳方式是什么

我们的项目由一个存储库组成,其中包含许多子模块(~50个,但没有嵌套),因此手动维护它们是我试图避免的事情

这必须是可能的,但我没有偶然发现什么是最好的组织,以及如何检索它

任何帮助都将不胜感激


谢谢你,亚尔。

我想我遇到了类似于你的问题。我的问题是不同网络上的开发人员有不同的子模块路径。我的解决方案是使用
url.PATH.代替url
,并设置一个变量来填充url。见下文。我在.bashrc中设置GITPUB以指向存储所有公共回购的位置

git config --global url.file:///MY/PATH/.insteadOf file:///GITPUB
git config -f .gitmodules submodule.MYSUBMODULE.url=file:///GITPUB/subrepo.git
git submodule sync MYSUBMODULE
git submodule update MYSUBMODULE
您必须为每个子模块执行此操作,但在脚本中很容易执行

我们通过在repo.git和每个submodule.git中运行以下命令来创建repo和子模块包
git bundle创建myrepo.bundle——全部
。您可以使用
since=
进行增量更新
git bundle创建myrepo.bundle--all--since=8/30/19


另一方面,您可以使用git pull myrepo.bundle my_分支从bundle中提取
git clone-mirror myrepo.bundle
执行完整导出时,您可以使用
git clone镜像bundle—镜像myrepo.bundle
执行此操作的最简单方法可能是只在主存储库中携带子模块历史记录。这样,当您克隆主项目时,您将获得所有子模块的历史记录。
git submodule
helper命令不会自动处理这一问题,但争论也不是很难:将您感兴趣的子模块历史记录作为子模块命名的分支携带

一次性设置:

git config -f .gitmodules submodule.MYSUBMODULE.url ./
git config -f .gitmodules submodule.MYSUBMODULE.path MYSUBMODULE
而不是
git子模块更新--init

git config submodule.MYSUBMODULE.active true
git config submodule.MYSUBMODULE.url ./
git clone -sn . MYSUBMODULE 
git submodule --quiet absorbgitdirs MYSUBMODULE
git -C MYSUBMODULE checkout $(git rev-parse :MYSUBMODULE)
因此克隆上的
-sn
告诉git不要复制对象数据库,也不要执行它通常的自动签出。显式签出是属于那里的跟踪提交,您甚至可以使用
git子模块更新
,这是同样的事情

我把这些东西作为makefile目标,安装依赖于utils/.git,utils/.git只是检查子模块是否需要,如果需要,就进行设置:

.PHONY: setup
setup:  utils/.git ;

utils/.git:
    @if _=`git rev-parse -q --verify :utils`; then \
        git config submodule.utils.active true \
        && git config submodule.utils.url ./ \
        && git clone -sn . utils \
        && git submodule --quiet absorbgitdirs utils \
        && git -C utils checkout $$(git rev-parse :utils); \
    fi

(将每行的第一个空格替换为制表符,markdown不使用制表符)

如何下载子模块镜像?如果超级项目是用--mirror克隆的,那么它是一个裸存储库,所以您不能运行git submodule init,对吗?我们使用
git bundle
打包存储库和每个子模块。然后从包中提取更新。我将在上面详细说明。。