2013-10-10 97 views
2

我目前正在研究位于美国的这个超级git(带子模块的git回购),需要大约40分钟才能克隆。 为了减少克隆时间,需要创建该回购的本地镜像。 子模块的路径与supergit相关,并且有多个分支,其中一些子模块比其他子模块多。从超级大本营创建本地git镜像

我做了一个脚本,它解析所有子模块及其相对路径,并将每个子模块克隆到正确的位置,但仅适用于一个分支(我必须对每个分支重复此操作,这就是我卡住的位置)。

有没有办法以一种干净的方式克隆这个supergit?

+0

克隆是一个完整的回购操作,所以当你克隆子模块时,你会得到所有的分支。所以我不明白为什么你认为你“必须为每个分支重复这个”。具体来说,你对那些不起作用的其他分支做了什么,因此你认为更多克隆是必要的? – jthill

+0

比方说,我创建了镜子。我可以从镜像克隆,但是当我尝试执行'git submodule update --init'时,这会失败。 Git子模块更新尝试从my_mirror /../ relative_repo_pos下载数据,但它们仅存在于original_repo /../ relative_repo_pos。 这就是为什么我必须手动获取所有这些存储库,并将它们置于相对于my_mirror的正确位置。 问题的另一个问题是,我不得不镜像一个回购,但所有*回购,超级金额使用。不同的分支有不同的子模块,所以我必须为每个分支重复这一点。 –

回答

0

既然你可以分析一个.gitmodules文件留下的唯一一件事就是找到他们:上游

# collect all .gitmodules definitions into one file 
git rev-list --all --full-history --reverse -- .gitmodules \ 
| sort -u \ 
| sed s/$/:.gitmodules/ \ 
| git cat-file --batch \ 
| sed /^[0-9a-f]/d \ 
> gitmodules-aggregate 

# format as executable commands to build a dedup'd one: 
git config -lf gitmodules-aggregate | sort -u \ 
| sed " 
    s/=//
    s/'/'\\''/g 
    s//'/ 
    s/$/'/ 
    s,^,git config -f gitmodules-consolidated , 
" 

检查是否已经在不同的提交给出不同的定义。

+0

谢谢你的回答,我现在正在尝试这个,但如果我不是那个人,那么不应该“sed s/^ [0-9a-f]/d”有额外的破折号? 你想用什么替换? –

+0

哎呀,不,不应该有一个's'的。固定。 – jthill