Git不会初始化/同步/更新新的子模块

Dav*_*Eyk 98 git git-submodules

这是我.gitmodules文件内容的一部分:

[submodule "src/static_management"]
        path = src/static_management
        url = git://github.com/eykd/django-static-management.git
[submodule "external/pyfacebook"]
        path = external/pyfacebook
        url = http://github.com/sciyoshi/pyfacebook.git
Run Code Online (Sandbox Code Playgroud)

但是,.git/config只包含第一个:

[submodule "src/static_management"]
        url = git://github.com/eykd/django-static-management.git
Run Code Online (Sandbox Code Playgroud)

第二个子模块(external/pyfacebook)由功能分支中的另一个开发人员添加.我现在继承了开发,并检查了功能分支.但是,Git不会为我拉这个子模块.我试过了:

  • git submodule init
  • git submodule update
  • git submodule update --init
  • git submodule sync
  • 从中删除所有子模块定义.git/config并运行git submodule init.它只复制先前存在的子模块并忽略新的子模块.
  • .git/config手动输入新的子模块定义并运行git submodule update.只有以前存在的子模块才能更新.

在各种组合中,但是git根本不会.git/config根据新内容进行更新.gitmodules,也不会创建external/pyfacebook文件夹并拉出子模块的内容.

我错过了什么?手动干预(手动添加子模块条目.git/config)是否真正需要,为什么?

编辑:手动干预不起作用.手动添加新的子模块条目.git/config不会做任何事情.新的子模块被忽略.

Dav*_*ler 80

我有同样的问题 - 事实证明.gitmodules文件已提交,但实际的子模块提交(即子模块的提交ID的记录)不是.

手动添加它似乎可以解决问题 - 例如:

git submodule add http://github.com/sciyoshi/pyfacebook.git external/pyfacebook
Run Code Online (Sandbox Code Playgroud)

(即使没有从.git/config或.gitmodules中删除任何内容.)

然后提交它以正确记录ID.

为这个工作答案添加一些进一步的评论:如果git子模块init或git子模块更新不起作用,那么如上所述git submodule add url应该可以解决问题.人们可以通过交叉检查

 git config --list
Run Code Online (Sandbox Code Playgroud)

并且应该获取要在git config --list命令的结果中提取的子模块的条目.如果在配置结果中有子模块的条目,那么现在通常的git子模块更新--init应该拉你的子模块.要测试此步骤,您可以手动重命名子模块,然后更新子模块.

 mv yourmodulename yourmodulename-temp
 git submodule update --init
Run Code Online (Sandbox Code Playgroud)

要查明子模块中是否有局部更改,可以通过git status -u(如果要查看子模块中的更改)或git status --ignore-submodules(如果您不希望看到更改)看到它子模块).

  • @IgorGanapolsky 这是子模块的目标路径。 (2认同)
  • 一个用于读取“git config --list”中条目的行:`git config --list | grep 子模块 | sed -e "s/submodule\.//" -e "s/\(.*\)\.url=\(.*\)/git 子模块 add --force \2 \1/" | 重击` (2认同)

pal*_*lik 52

git版本2.7.4.此命令更新本地代码 git submodule update --init --force --remote

  • 什么都不做. (13认同)
  • 您可以使用“git submodule update --init --force --remote <module-name>”更新单个模块。 (3认同)
  • 也不适合我。 (2认同)

Qui*_*fox 33

你最近升级到git版本1.7.0.4吗?我做了,现在有类似的问题......

编辑:我解决了我的问题,但绝对不知道问题出在哪里.我手动从.git/config和.gitmodules中删除了子模块条目,并使用ususal步骤重新添加了我的子模块(git submodule add etc ...)... Worksforme但是没有为该线程添加任何值.

  • 这是git持续的弱点.对于外部人员来说,甚至svn也会更好. (8认同)
  • 我想我也遇到了这个问题(相同的步骤似乎最终解决了这个问题).我注意到的唯一的事情是,在再次添加之后,然后提交,提交说:创建模式160000 lib/jruby-swing-helpers(呵呵?) (3认同)

Ale*_*yuv 15

有同样的问题,当git忽略initupdate命令,并没有做任何事情.

怎么修

  1. 你的子模块文件夹应该被提交到git仓库
  2. 它不应该是.gitignore

如果符合要求,它将起作用.否则,将执行所有命令而不发送任何消息和结果.

如果你做了所有这些,但它仍然不起作用:

  1. 手动添加子模块,例如 git submodule add git@... path/to
  2. git submodule init
  3. git submodule update
  4. 提交并推送所有文件 - .gitmodules以及您的模块文件夹(注意,文件夹的内容不会提交)
  5. 放弃你当地的git repo
  6. 克隆一个新的
  7. 确保.git/config还没有任何子模块
  8. 现在,git submodule init- 您将看到模块注册的消息
  9. git submodule update - 将获取模块
  10. 现在看看,.git/config你会发现注册的子模块


DZe*_*Zet 11

这意味着子模块 Haven\xe2\x80\x99 未正确设置,并且git submodule add必须执行命令。子模块如何工作的详细解释:

\n

如果子模块正确添加:

\n

如果未正确提交,并且子模块及其相应的文件夹尚未记录在索引中,则首先需要通过单独添加 .gitmodules 文件中的每个子模块,git submodule add然后才能继续。

\n
    \n
  • 注意:正如这里提到的,Git 目前没有命令可以同时对 .gitmodules 文件中存在的多个子模块执行此操作。
  • \n
\n
\n

有什么git submodule add作用?

\n

当带有子模块的存储库已正确设置并且有人已执行命令时git submodule add,该命令已完成以下操作:

\n
    \n
  1. 如果 \xe2\x80\x99t 不存在,则创建一个子模块所在的文件夹
  2. \n
  3. 将项目克隆为子模块
  4. \n
  5. 在可共享的.gitmodules 文件中设置子模块参数
  6. \n
  7. 在您的私有.git/config 文件中设置子模块参数
  8. \n
  9. 在 superproject\xe2\x80\x99s 私有 .git/modules 文件夹中为子模块创建 .git 文件夹
  10. \n
  11. 并且:在 superproject\xe2\x80\x99s 索引中记录每个子模块将驻留在哪个文件夹中,以及它应该处于什么状态(子模块的哈希提交代码。)
  12. \n
\n

当您克隆超级项目时,第 3点和第 6 点相关,第6 点指示 a 是否git submodule add已正确执行并已提交。\n您可以通过查看子模块应驻留的文件夹是否已存在且为空来检查第6点(注意:这不需要 .keep 或 .gitignore 机制就位,因为这是 Git 机制的一部分。)克隆超级项目后,您还可以执行 agit submodule以查看需要哪些子模块。

\n

然后您可以继续执行以下操作:

\n
    \n
  • git submodule

    \n

    将显示树中存在的子模块及其相应的提交哈希代码,可以作为初始检查以查看需要哪些子模块

    \n
  • \n
  • git submodule init

    \n

    将子模块参数从 repo\xe2\x80\x99s .gitmodules 文件复制到您的私有 .git/config 文件(点4

    \n
  • \n
  • git submodule update

    \n

    将子模块克隆到由超级项目确定的提交,并在超级项目的 .git/modules/ 文件夹下创建 submodules\' .git 文件夹(点25

    \n
  • \n
  • git submodule update --remote

    \n

    与 update 相同,但将子模块设置为远程存储库可用的分支上的最新提交,类似于随后进入每个 submodule\xe2\x80\x99s 文件夹并执行git pull

    \n
  • \n
  • 或 --->: \ngit submodule update --init --remote

    \n

    这是以上所有内容的总和。

    \n
  • \n
\n

或者,当存储库设置正确时,您还可以使用git clone--recursive标志来包含子模块,并自动对其执行初始化和更新。

\n


Car*_*ood 9

答案中似乎(也)有很多混乱。

git submodule init打算神奇生成的东西的.git /配置(从.gitmodules)。它的目的是在克隆父项目后在一个完全空的子目录中设置一些东西,或者拉一个添加以前不存在的子模块的提交。

换句话说,您git clone通过git submodule update --init --recursive.

没有git submodule add ...git submodule init(或git submodule update --init)后面,这不应该起作用。事实上,如果一切正常,添加将已经更新适当的 .git/config。

编辑

如果以前不存在的 git 子模块是由其他人添加的,并且您执行了git pull该提交,则该子模块的目录将完全为空(当您执行git submodule status新子模块的哈希值应该是可见的,但会-在前面有一个它。)在这种情况下,你需要在你的后面加上git pull一个git submodule update --init--recursive当它是子模块中的子模块时加上),以便检出新的、以前不存在的子模块;就像在对带有子模块的项目进行初始克隆之后一样(显然您之前也没有这些子模块)。


far*_*ace 8

认为手动设置.gitmodules就足够了是错误的

git version 2.22.0在撰写本文时,我的本地人。

所以我来到这个线程想知道为什么git submodule init不起作用;我设置了.gitmodules文件并继续执行git submodule init...

重要的

  1. git submodule add company/project.git includes/project必需的(第一次添加模块时),这将:

    • 将配置添加到 .git/config
    • 更新.gitmodules文件
    • 跟踪子模块位置(includes/project在本例中)。
  2. 必须那么git commit您已经添加子模块之后,这将提交.gitmodules和跟踪的子模块的位置。

再次克隆项目时,它将具有.gitmodules和 空的子模块目录(例如includes/project在本例中)。在这一点上.git/config还没有子模块配置,直到git submodule init运行,记住这只有效,因为.gitmodulesANDincludes/project在主 git repo 中被跟踪。

另请参阅:


小智 8

我遇到了同样的问题,但上述解决方案都没有帮助。.gitmodules 和 .git/config 中的条目是正确的,但命令git submodules update --init --recursive什么也没做。我还删除了子模块目录并确实运行git submodules update --init --recursive并取回了子模块目录,但与以前完全相同的提交。

我在这个页面上找到了答案。命令是:git submodule update --remote

  • 这对我来说也是正确的解决方案。我正在运行“git submodule update”而不是“git submodule update --remote”。 (2认同)

Ven*_*ryx 6

对我来说,问题是存储库的前开发人员已将该submodules/thing文件夹作为常规文件夹提交,这意味着当我尝试运行时git submodule add ...,它会失败:'submodules/thing' already exists in the index,但尝试更新子模块也会失败,因为它发现路径没有包含一个子模块。

要修复此问题,我必须删除该submodules/thing文件夹,提交删除,然后运行git submodule add命令将其正确添加回来:

git submodule add --force --name thing https://github.com/person/thing.git submodules/thing
Run Code Online (Sandbox Code Playgroud)


dir*_*lic 5

根据戴夫·詹姆斯·米勒的回答,我可以确认它对我有用。这里重要的是提交子项目提交 ID。仅仅在 .gitmodules 中添加条目是不够的。

这是一个合适的提交:

https://github.com/dirkaholic/vagrant-php-dev-box/commit/d5f4c40bdbd80eefbb5ac6029823733f591435ae


Lev*_*ira 5

有点不可思议,但是今天我跑了,git submodule init接着又 git submodule sync跟着git submodule update,它开始拉动我的子模块...魔术?也许!这确实是Git上最烦人的经历之一。

刮一下。我实际上是通过这样做使它工作的git submodule update --init --recursive。希望这可以帮助。

PS:确保您位于git根目录中,而不是子模块中。

  • 不,这绝对对我没有任何帮助。 (5认同)