如何将已克隆的项目添加为子模块?

时间:2013-05-23 22:44:09

标签: git git-submodules

我在一个文件夹中有很多项目,我克隆了很长一段时间;最近我将整个文件夹移动到我的一个repos中,并希望将这些克隆项目转换为子模块,以便将来更好地更新和控制。我已经搜索了很多关于如何执行此操作的内容,但所有教程仅讨论了如何添加子模块。有人可以帮帮我吗?

3 个答案:

答案 0 :(得分:7)

将现有git存储库添加为子模块与添加新模块相同。

  1. 首先将包含所有git存储库的文件夹本身设为git init的git存储库。
  2. 使用git submodule add https//example.com/remoterepo ./localrepo,其中./localrepo是您现有的git存储库。
    • 注意:您从remoterepo获取localrepo/.git/config的网址。
  3. 对要添加为子模块的所有现有存储库重复第二步。
  4. 现在,您可以运行git submodule foreach git pull来更新所有子项目。
  5. 如果你有很多子模块,你可能想写一个小脚本来自动化第二步,这应该不难。

    修改

    以下是我用来尝试重现评论中提到的错误的内容。我对命令进行了三重检查,而仍然看不到错误:

    git --version
    
    mkdir submoduletest
    cd submoduletest
    
    git init --bare remote_repo_A
    git init --bare remote_repo_B 
    
    git clone remote_repo_A local_repo_A
    git clone remote_repo_B local_repo_B
    
    cd local_repo_A
    echo "test commit on repo B" >> test.txt
    git add test.txt
    git commit -m 'test commit message'
    git push origin master
    
    cd ../local_repo_B
    echo "test commit on repo B" >> test.txt
    git add test.txt
    git commit -m 'test commit message'
    git push origin master
    
    cd ../local_repo_A
    git clone ../remote_repo_B local_repo_B
    git submodule add ../remote_repo_B ./local_repo_B
    git submodule foreach git pull origin master
    
    git add .
    git ci -m 'we just added a submodule for remote_repo_B'
    
    git submodule status
    

    使用以下命令检查local_repo_A的当前状态,它只有两个blob对象,一个用于'test.txt',另一个用于隐式创建的'.gitmodules'文件,没有来自{{1} }被添加到remote_repo_B索引

    local_repo_A

    我回滚编辑的原因是因为编辑只是错误,已经被其他两个调解员和我拒绝了,但后来其他一些人批准了它,我不确定是不是是SO或什么的错误。但是编辑被拒绝了,即使是现在因为它完全错了,我已经在评论中解释了为什么,我对任何人都不反感,但这浪费了我的时间,如果答案对你的答案没有帮助,那就投票了你。

    同样,如果你没有改进它,请不要编辑我的答案。

答案 1 :(得分:1)

我将添加@ neevek的答案,如果你收到already exists in the index错误,那么你可以尝试这个版本:

  1. 缓存中删除所有“已克隆的存储库”:
    (因为那里已经有一个对象没有指向存储库作为子模块,并且必须首先从索引中删除它以防止冲突。您的存储库的内容或索引将被删除这样做)

    git rm --cached ./localrepo
    
  2. 使用git submodule add https//example.com/remoterepo ./localrepo,其中./localrepo是您现有的git存储库。

    • 注意:您从remoterepo获取localrepo/.git/config的网址。
  3. 对要添加为子模块的所有现有存储库重复第二步。
  4. 现在,您可以运行git submodule foreach git pull来更新所有子项目。
  5. 如果您有许多子模块,您可能需要编写一个小脚本来自动执行第二步。

答案 2 :(得分:1)

要添加许多子模块,我编写了以下简单循环:

for repo in vim/bundle/*
do
  echo $repo
  pushd $repo
  url=$(git remote get-url $(git remote))
  echo $url
  popd
  git submodule add $url ./$repo
done

明显的局限性我没有去解决:

  • 不需要更改目录,非常确定您可以将git目录作为参数传递给命令
  • git remote实际上会返回所有远程,而不仅仅是当前的,因此如果有多个远程脚本会中断