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

下面是我的 .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

然而,.git/config只包含第一个:

[submodule "src/static_management"]
url = git://github.com/eykd/django-static-management.git

第二个子模块(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 不会根据 .gitmodules的新内容更新 .git/config,也不会创建 external/pyfacebook文件夹并拉出子模块的内容。

我遗漏了什么? 真的需要手动干预(手动向 .git/config添加子模块条目)吗? 为什么?

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

167084 次浏览

我也遇到了同样的问题。提交了 gitmodule 文件,但没有提交实际的子模块提交(即子模块的提交 ID 记录)。

手动添加似乎可以解决这个问题——例如:

git submodule add http://github.com/sciyoshi/pyfacebook.git external/pyfacebook

(甚至不需要从. git/config 或. gitmodule 中删除任何内容。)

然后提交它以正确地记录 ID。

为这个工作答案添加一些进一步的注释: 如果 git 子模块 init 或 git 子模块 update 不工作,那么如上所述,添加 url 应该可以解决这个问题。我们可以交叉核对一下

 git config --list

并且应该得到一个子模块的条目,您想要拉入 git config —— list 命令的结果。如果您的子模块在配置结果中有一个条目,那么现在通常的 git 子模块更新—— init 应该提取您的子模块。若要测试此步骤,可以手动重命名子模块,然后更新子模块。

 mv yourmodulename yourmodulename-temp
git submodule update --init

为了查明子模块中是否有本地更改,可以通过 git status-u (如果您想查看子模块中的更改)或 git status-Igne-submodule (如果您不想查看子模块中的更改)查看它。

根据戴夫 · 詹姆斯 · 米勒的回答,我可以确定这对我是有效的。这里重要的是提交子项目提交 ID。只需要输入。Gitmodule 还不够。

这里有一个适当的提交:

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

我也有同样的问题。

.gitmodules有这个子模块,但在执行了 git submodule init命令之后,它就不在 .git/config中了。

原来,添加子模块的开发人员还将子模块目录添加到了 .gitignore文件中。没用的。

和你一样,我发现 git 子模块 sync 不能完成你所期望的任务。 只有在再次执行显式 git submodule add之后,子模块 URL 才会更改。

所以,我把这个脚本放在 ~/bin/git-submodule-sync.rb:

Https://gist.github.com/frimik/5125436

我还在一些接收后的 git 部署脚本中使用了相同的逻辑。

我现在需要做的就是编辑 .gitmodules,然后运行这个脚本,它最终像我认为的 git submodule sync应该工作。

当我今天看到这个的时候,一个开发人员已经将树的一部分移动到一个新的子目录中,看起来好像他的 git 客户机没有在树中记录更新后的子项目规则,相反,它们只是被删除了,留下的 .gitmodules既指向陈旧的位置,也指向当前树中不再存在的子项目。

将子模块添加回来,并将子模块的提交 shas 与 git show $breaking_commit_sha中的提交 shas (搜索匹配 regexp ^-Subproject的行)进行比较,以根据需要进行调整。

有点神奇,但今天我运行了 git submodule init git submodule sync接着是 git submodule update然后就开始了 拉动我的子模块... 魔法? 也许吧! 这真的是最 Git 的烦人经历。

算了吧,我其实是通过 git submodule update --init --recursive让它工作的,希望这个能帮上忙。

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

遇到了同样的问题,当 git 忽略 initupdate命令时,它什么也不做。

如何修复

  1. 您的子模块文件夹应该提交到 git repo
  2. 它不应该出现在,吉蒂诺尔

如果满足了这些要求,它将工作。否则,所有命令将在没有任何消息和结果的情况下执行。

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

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

Git 版本2.7.4。这个命令更新本地代码 Git 子模块 update —— init —— force —— remote

这里的答案似乎也很混乱。

git submodule init没有,意在神奇地在。Git/config (来自。Gitmodule).它的目的是在克隆父项目或提交添加以前不存在的子模块的提交之后,在一个完全空的子目录中设置一些内容。

换句话说,您遵循具有子模块的项目的 git clone(通过克隆检出了。Gitmodule 文件)。

你做 没有跟随 git submodule add ...git submodule init(或 git submodule update --init) ,这是不应该工作。实际上,该添加已经更新了适当的。Git/config 是否正常工作。

剪辑

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

我今天也遇到了同样的问题,我发现因为我输入了 git submodule init,所以我在 .git/config中有了这样一行字:

[submodule]
active = .

我把它删掉,然后打出:

git submodule update --init --remote

一切恢复正常,我的子模块像往常一样在它的子目录中更新。

如果在 git submodule add ...之前存在子模块 dir 及其内容(“外部/pyfacebook”文件夹) ,则删除它可能会修复问题。

我在使用子模块时也遇到了类似的问题,它只是不想被克隆/提取/更新/随便什么。

当尝试使用 git submodule add git@my-repo.git destination重新添加子模块时,我得到了以下输出:

A git directory for 'destination' is found locally with remote(s):
origin        git@my-repo.git
If you want to reuse this local git directory instead of cloning again from
git@my-repo.git
use the '--force' option. If the local git directory is not the correct repo
or you are unsure what this means choose another name with the '--name' option.

所以,我试着 执行 add 命令:
git submodule add --force git@my-repo.git destination

这招对我很管用。

郑重声明:
我通过添加一个 空的储存库作为子模块创建了相同的问题。在这种情况下,没有可用于子模块的引用散列,导致原始海报所描述的错误。

强制-在承诺使用存储库之后添加存储库解决了这个问题(如《 Arvids 邮报》)
git submodule add --force git@my-repo.git destination

  • .git/config中删除子模块
  • 运行 git submodule init命令
  • 转到子模块目录并运行 git pull origin master

现在应该可以了

认为手动设置 .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 submodule init之前,.git/config还没有子模块配置,请记住,这只有在主 git repo 中跟踪 .gitmodulesincludes/project时才有效。

另请参阅:

我也有同样的问题,但是上面的解决方案都没有帮助。中的条目。Gitmodule 和 in。Git/config 是正确的,但是命令 git submodules update --init --recursive什么也没做。我还删除了子模块目录,并且运行了 git submodules update --init --recursive并返回了子模块目录,但是提交操作与前面完全相同。

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

对我来说,问题是,回购的前开发人员提交的 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

只是分享一下对我有用的东西:

git clone --recurse-submodules <repository path>

这将克隆已经包含子模块的远程存储库。这意味着在克隆之后不需要运行 git 子模块 update 或 init。

下面的 sync 命令解决了这个问题:

git submodule sync

请检查您的子模块目录。

如果只有一个. git 文件,那么删除它。

现在执行 git submodule update --remote --init

这意味着子模块没有正确设置,必须执行 git submodule add命令

如果子模块正确添加 没有:

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

  • 注意 : 正如前面提到的 给你,Git 目前没有一个命令可以对。Gitmodule 文件。

git submodule add是做什么的?

如果已经正确设置了带子模块的回购,并且有人已经执行了 git submodule add命令,则该命令将执行以下操作:

  1. 如果子模块不存在,则创建一个子模块驻留的文件夹
  2. 将项目克隆为子模块
  3. 可分享的.gitmodule 文件中设置子模块参数
  4. 二等兵.git/config 文件中设置子模块参数
  5. 为超级项目的私有. git/module 文件夹中的子模块创建一个. git 文件夹
  6. 还有: 在您的超级项目的索引中记录每个子模块,它将驻留在哪个文件夹中,以及它应该处于什么状态(子模块的散列提交代码)

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

然后,你可以这样做:

  • git submodule

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

  • git submodule init

    将子模块参数从 repo 的. gitmodule 文件复制到您的 private. git/config 文件(点 4)

  • git submodule update

    将子模块克隆到由超级项目确定的提交中,并创建子模块的。超级项目下的 git 文件夹。Git/module/file (点 25)

  • git submodule update --remote

    与 update 相同,但是将子模块设置为远程回购可用的分支上的最新提交,类似于之后进入每个子模块的文件夹并执行 git pull操作

  • 或—— > : git submodule update --init --remote

    所有这些加起来。

或者 ,当正确设置回购时,您也可以使用 --recursive标志执行 git clone,以包含带有 init 的子模块,并自动对它们执行更新。

我也遇到了同样的问题,对我来说,解决方法很简单:

  1. 删除空文件夹(子模块名称)
  2. 运行 git submodule update

根据 废物之书,如果您想将子模块的默认分支“拉”到当前正在处理的本地回购中,请尝试 git submodule update --remote

要了解如何跟踪另一个分支,请仔细检查上述文件。

还有一种更简单的方法可以做到这一点,如果您不想手动获取 > 并合并到子目录中。如果运行 Git 子模块 update —— remote,Git 将进入您的子模块,并为您提取和更新。

$ git submodule update --remote DbConnector
remote: Counting objects: 4, done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 4 (delta 2), reused 4 (delta 2)
Unpacking objects: 100% (4/4), done.
From https://github.com/chaconinc/DbConnector
3f19983..d0354fc  master     -> origin/master
Submodule path 'DbConnector': checked out 'd0354fc054692d3906c85c3af05ddce39a1c0644'