【问题标题】:Add a list of submodules to the git将子模块列表添加到 git
【发布时间】:2016-05-25 09:10:00
【问题描述】:

我已经克隆了一个项目并对其进行了自定义。该项目正在使用一些额外的项目作为子模块。我已经设置了我的 git 存储库并将主项目推送到那里。但我没有将子模块添加到我的 git 项目中。

我想将子模块拉到我的项目中。我知道使用以下命令可以一一添加子模块:

git 子模块添加<sub-m url> <path>

但它们很多。还有另一种方法可以自动将它们添加在一起吗?这是子模块的列表:

submodule "submodules/bcg729"]
    url = git://git.linphone.org/bcg729.git
[submodule "submodules/bctoolbox"]
    url = git://git.linphone.org/bctoolbox.git
[submodule "submodules/belcard"]
    url = git://git.linphone.org/belcard.git
[submodule "belle-sip"]
    url = git://git.linphone.org/belle-sip.git
[submodule "submodules/belr"]
    url = git://git.linphone.org/belr.git
[submodule "submodules/bzrtp"]
    url = git://git.linphone.org/bzrtp.git
[submodule "submodules/cmake-builder"]
    url = git://git.linphone.org/linphone-cmake-builder.git
[submodule "submodules/externals/antlr3"]
    url = git://git.linphone.org/antlr3.git
[submodule "submodules/externals/axmlrpc"]
    url = git://git.linphone.org/axmlrpc.git
[submodule "submodules/externals/bv16-floatingpoint"]
    url = git://git.linphone.org/bv16-floatingpoint.git
[submodule "submodules/externals/cunit"]
    url = git://git.linphone.org/cunit.git
[submodule "submodules/externals/ffmpeg"]
    url = git://git.linphone.org/ffmpeg.git
[submodule "submodules/externals/gsm"]
    url = git://git.linphone.org/gsm.git
[submodule "submodules/externals/libmatroska"]
    url = git://git.linphone.org/libmatroska-c.git
[submodule "submodules/externals/libupnp"]
    url = git://git.linphone.org/libupnp.git
[submodule "submodules/externals/libvpx"]
    url = https://chromium.googlesource.com/webm/libvpx
[submodule "submodules/externals/libxml2"]
    url = git://git.gnome.org/libxml2.git
[submodule "submodules/externals/mbedtls"]
    url = git://git.linphone.org/mbedtls.git
[submodule "submodules/externals/opencore-amr"]
    url = git://git.linphone.org/opencore-amr.git
[submodule "submodules/externals/openh264"]
    url = https://github.com/cisco/openh264
[submodule "submodules/externals/opus"]
    url = git://git.linphone.org/opus.git
[submodule "submodules/externals/speex"]
    url = git://git.linphone.org/speex.git
[submodule "submodules/externals/srtp"]
    url = git://git.linphone.org/srtp.git
[submodule "submodules/externals/vo-amrwbenc"]
    url = git://git.linphone.org/vo-amrwbenc.git
[submodule "submodules/externals/x264"]
    url = git://git.linphone.org/x264.git
[submodule "submodules/linphone"]
    url = git://git.linphone.org/linphone.git
[submodule "submodules/msamr"]
    url = git://git.linphone.org/msamr.git
[submodule "submodules/mscodec2"]
    url = git://git.linphone.org/mscodec2.git
[submodule "submodules/msopenh264"]
    url = git://git.linphone.org/msopenh264.git
[submodule "submodules/mssilk"]
    url = git://git.linphone.org/mssilk.git
[submodule "submodules/mswebrtc"]
    url = git://git.linphone.org/mswebrtc.git
[submodule "submodules/msx264"]
    url = git://git.linphone.org/msx264.git
[submodule "linphone"]
    url = git://git.linphone.org/linphone.git

【问题讨论】:

  • 该列表不在.gitmodules 文件中?我只是git clone https://github.com/guardianproject/linphone-ios-secure(这是一个与您有类似子模块的项目),然后git submodule update --init 完成了这项工作
  • 是的,我使用的是 Linphon android,但我创建了一个不包含该子模块的 git 存储库。我只想处理我的代码,不想将子模块添加到我的存储库中,我正在寻找一种在克隆项目时在本地获取子模块的方法。
  • 实际上我在 Linphone 代码上做了很多工作,然后我将它添加到我的存储库中。过了一会儿,我将在另一台设备上克隆它,但子模块不存在,所以我想找到一种方法在有人获取我的代码时添加它们。我对git不太熟练

标签: git github git-submodules


【解决方案1】:

根据@eis 的建议,您必须创建一个脚本来执行所有git add 命令。

一种方法是创建包含您需要的.gitmodules,然后使用如下脚本对其进行解析:

iterator=1;
subpaths=$(git config --file .gitmodules --get-regexp path | awk '{ print $2}');
subrepos=$(git config --file .gitmodules --get-regexp url | awk '{ print $2}');
for path in $subpaths; do
  repo=$(echo "$subrepos"| sed $iterator'q;d');
  git submodule add $repo $path;
  let iterator++;
done

【讨论】:

    【解决方案2】:

    我不认为 git 有这样的方法。但是,您可以只编写一个 shell 脚本来迭代您的列表并逐个调用 git submodule add


    为什么只将它们复制到 .gitmodules 或 .git/index 并不能解决问题:

    “git submodule add”命令做了几件事:

    • 它会克隆当前目录下的子模块,并默认签出 master 分支。
    • 它将子模块的克隆路径添加到“.gitmodules”文件中,并将该文件添加到索引中,准备提交。
    • 它将子模块的当前提交 ID 添加到索引中,准备提交。

    (source)

    所以你会错过最后一步,并且 git submodule init/update 期望提交 id 已经到位。这就是您需要git submodule add 的原因。

    【讨论】:

    • 我要测试一下,我会告诉你结果,谢谢
    • 该死的,看来你是对的!遗憾的是,没有命令在 onem 中添加一组 repo,所以@eis 的答案是正确的。您可能会从该答案中获得额外帮助:stackoverflow.com/questions/7629822/…
    • 我已经写了一个shell脚本来做到这一点,就像你说的那样。它解决了我的问题。但我希望 git 本身有另一种方法。谢谢大家。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-22
    • 2017-06-29
    • 1970-01-01
    • 2011-06-03
    • 2016-09-30
    • 2015-08-16
    • 1970-01-01
    相关资源
    最近更新 更多