时间:2010-07-26 16:47:39

标签: git git-submodules

22 个答案:

答案 0 :(得分:75)

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

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

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

(即使没有从.git / config或.gitmodules中删除任何东西。)

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

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

交叉检查
 git config --list

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

 mv yourmodulename yourmodulename-temp
 git submodule update --init

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

答案 1 :(得分:48)

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

答案 2 :(得分:32)

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

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

答案 3 :(得分:14)

有同样的问题,当git忽略initupdate命令时,什么都不做。

如何修复

  1. 您的子模块文件夹应该提交到git repo
  2. 它不应该是.gitignore
  3. 如果满足要求,它将起作用。否则,所有命令都将在没有任何消息和结果的情况下执行。

    如果你做了所有这些,但它仍然无法运作:

    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,您会找到已注册的子模块

答案 4 :(得分:4)

  

神奇地排序,但今天我跑了git submodule init然后   git submodule sync后跟git submodule update,然后就开始了   拉我的子模块......魔术?也许!这确实是最多的   与Git讨厌的经历...

抓一点。我实际上通过git submodule update --init --recursive来实现它。希望这会有所帮助。

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

答案 5 :(得分:4)

答案中似乎也有很多混淆。

git submodule init 旨在神奇地在.git / config(来自.gitmodules)中生成内容。它旨在在克隆父项目之后在完全空的子目录中设置某些内容,或者提取添加先前不存在的子模块的提交。

换句话说,您通过git clone跟踪具有子模块的项目的git submodule update --init --recursive(您将通过克隆检出.gitmodules文件的事实知道)。

你做{strong>不关注git submodule add ... git submodule init(或git submodule update --init),这是不可行的。事实上,如果事情有效,add将会更新相应的.git / config。

修改

如果其他人添加了以前不存在的git子模块,并且您执行了该提交的git pull,那么该子模块的目录将完全为空(当您执行git submodule status时新的子模块的哈希值应该是可见的,但前面会有-。)在这种情况下,您需要关注git pull git submodule update --init(加{{} 1}}当它是子模块内的子模块时,为了获得新的,先前不存在的子模块;就像在带有子模块的项目的初始克隆之后(显然你之前没有那些子模块)。

答案 6 :(得分:3)

我遇到了同样的问题。

.gitmodules有子模块,但在git submodule init命令之后,它不在.git/config

结果显示添加了子模块的开发人员还将子模块目录添加到.gitignore文件中。这不起作用。

答案 7 :(得分:2)

根据Dave James Miller的回答,我可以确认它对我有用。这里重要的是提交子项目提交ID。只是在.gitmodules中输入是不够的。

这是一个适当的提交:

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

答案 8 :(得分:2)

与我相同,我发现git子模块同步不能达到您的预期。 只有在再次显式git submodule add之后,子模块网址才会更改。

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

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

我也在一些post-receive git deploy脚本上使用相同的逻辑。

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

答案 9 :(得分:1)

当我今天看到这个时,开发人员已经将树的一部分移动到一个新的子目录中,看起来他的git客户端没有在树中记录更新的子项目规则,而是他们刚刚被修复,留下{ {1}}引用陈旧位置和当前树中不再存在的子项目。

重新添加子模块,并将子模块的提交词与.gitmodules中的提交词进行比较(搜索匹配regexp git show $breaking_commit_sha的行),以根据需要调整固定内容。

答案 10 :(得分:1)

我今天遇到了同样的问题并且发现因为我输入git submodule init然后我在.git/config中有了这些行:

[submodule]
   active = .

我将其删除并输入:

git submodule update --init --remote

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

答案 11 :(得分:1)

我的子模块有类似的问题。它只是不想被克隆/拉/更新/无论如何。

尝试使用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.

所以,我尝试强制执行添加命令
git submodule add --force git@my-repo.git destination

这适用于我的情况。

答案 12 :(得分:1)

我遇到了同样的问题,但以上解决方案均无济于事。 .gitmodules和.git / config中的条目是正确的,但是命令git submodules update --init --recursive没有执行任何操作。我还删除了子模块目录,并运行了git submodules update --init --recursive,并返回了子模块目录,但提交的方式与以前完全相同。

我在此page上找到了答案。该命令是:git submodule update --remote

答案 13 :(得分:0)

这意味着尚未正确设置子模块,并且必须执行git submodule add命令。

是否正确添加了子模块

为了提供一些背景信息,当正确设置了带有子模块的存储库后,某人已经执行了git submodule add命令,该命令将执行以下操作:

  1. 为子模块创建一个文件夹(如果尚不存在)
  2. 将项目克隆为子模块
  3. shared .gitmodules文件
  4. 中设置子模块参数
  5. 在您的 private .git / config文件
  6. 中设置子模块参数
  7. 在您的超级项目的私有.git / modules文件夹中为子模块创建.git文件夹
  8. ,并且:在您的超级项目的索引中记录每个子模块将驻留在哪个文件夹中以及它应处于什么状态(子模块的哈希提交代码)。
克隆超级项目时,

3 6 是相关的,点 6 指示是否已执行git submodule add正确并且被承诺。 您可以通过查看子模块应该位于其中的文件夹是否已经存在并且为空来检查 6 点(注意:这不需要.keep或.gitignore机制到位,因为这是Git机制的一部分。)克隆超级项目后,您还可以执行git submodule来查看需要哪些子模块。

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

  • git submodule

    将显示树中存在的子模块及其相应的提交哈希码,可以用作初步检查以查看期望哪些子模块

  • git submodule init

    将子模块参数从存储库的.gitmodules文件复制到您的私有.git / config文件(指向 4

  • git submodule update

    将子模块克隆到由超级项目确定的提交,并在超级项目的.git / modules /文件夹下创建子模块的.git文件夹(指向 2 5

  • git submodule update --remote

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

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

    是以上所有内容的组合。

或者,如果正确配置了存储库,则还可以使用带有git clone标志的--recursive来包含带有初始化和更新功能的子模块。自动。

如果未正确添加子模块

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

  • 注意:如here所述,Git当前没有针对.gitmodules文件中存在的多个子模块立即执行此操作的命令。

答案 14 :(得分:0)

下面的同步命令解决了该问题:

git submodule sync

答案 15 :(得分:0)

只分享对我有用的东西:

git clone --recurse-submodules <repository path>

这将克隆已经包含子模块的远程存储库。这意味着克隆后无需运行git子模块更新或init。

答案 16 :(得分:0)

对我来说,问题是仓库的先前开发人员将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

答案 17 :(得分:0)

认为手动设置.gitmodules就足够了 WRONG

撰写本文时,我的本地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在运行.gitmodules之前还没有子模块配置,并且请记住,这仅是有效的,因为在主git存储库中跟踪了includes/projectmax = df.sort_index(ascending=True).rolling(10).max() 。 / p>

另请参阅:

答案 18 :(得分:0)

  • 从您的.git/config移除子模块
  • 运行git submodule init命令
  • 转到子模块目录并运行git pull origin master

现在应该可以使用

答案 19 :(得分:0)

记录下来:
我通过添加空存储库作为子模块来创建相同的问题。在这种情况下,子模块没有可用的参考哈希,从而导致原始发布者描述的错误。

在致力于解决问题之后强制添加存储库(如Arvids帖子中所述)
[2018-07-19 13:12:01] production.ERROR: The resource owner or authorization server denied the request. {"exception":"[object] (League\\OAuth2\\Server\\Exception\\OAuthServerException(code: 9): T$ [stacktrace]

答案 20 :(得分:0)

删除子模块目录及其内容(“external / pyfacebook”文件夹)(如果它存在于git submodule add ...之前可能会解决问题。

答案 21 :(得分:-1)

请检查您的子模块目录。

如果其中只有.git文件,则将其删除。

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