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模块( external/pyfacebook )是由另一个开发人员添加到特性分支中的。 我已经inheritance了开发,并已经检查了function分支。 但是,Git不会为我抽取子模块。 我试过了:

  • git submodule init
  • git submodule update
  • git submodule update --init
  • git submodule sync
  • .git/config删除所有子模块定义并运行git submodule init 。 它只复制以前存在的子模块而忽略新模块。
  • .git/config手动input新的子模块定义并运行git submodule update 。 只有以前存在的子模块才会更新。

但是git根本不会更新基于.gitmodules的新内容的.git/config ,也不会创buildexternal/pyfacebook文件夹并且拉取子模块的内容。

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

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

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

编辑:我解决了我的问题,但绝对不知道问题出在哪里。 我手动从.git / config和.gitmodules中删除子模块条目,并重新添加我的子模块与ususal步骤(git子模块添加等…)… Worksforme但没有增加此线程的价值。

我有这个相同的问题 – 事实certificate,提交.gitmodules文件,但实际的子模块提交(即子模块的提交ID的logging)不是。

手动添加它似乎是诀窍 – 例如:

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

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

然后提交它来正确loggingID。

添加一些进一步的评论这个工作的答案:如果git子模块init或git子模块更新does not不起作用,然后如上所述git子模块添加url应该做的伎俩。 可以通过检查这个

  git config --list 

并且应该在git config –list命令的结果中得到你想要的子模块的入口。 如果在configuration结果中有子模块的input,那么现在通常的git子模块更新–init应该拉你的子模块。 要testing此步骤,您可以手动重命名子模块,然后更新子模块。

  mv yourmodulename yourmodulename-temp git submodule update --init 

要发现子模块中是否有本地更改,可以通过git status -u(如果要查看子模块中的更改)或git status –ignore-submodules(如果不想查看更改子模块)。

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

有同样的问题,当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回购
  6. 克隆一个新的
  7. 确保.git/config还没有任何子模块
  8. 现在, git submodule init – 你会看到一个消息,该模块注册
  9. git submodule update – 将获取模块
  10. 现在看看.git/config ,你会发现注册的子模块

奇迹般地sorting,但今天我跑git submodule init跟着git submodule sync跟着git submodule update ,它开始拉动我的子模块…魔术? 也许! 这是Git最令人讨厌的经验之一。

刮那个。 我其实通过做git submodule update --init --recursive得到它的工作。 希望这可以帮助。

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

答案中似乎也有很多困惑(也)。

git submodule init 并不是要在.git / config(从.gitmodules)中奇迹般地生成东西。 在克隆父项目之后,或者拉取一个添加了以前不存在的子模块的提交,可以在完全空的子目录中设置一些东西。

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

遵循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 (加上 – 当它是一个子模块内的子模块时git submodule update --init ),以获得新的,以前不是 – 检出子模块; 就像在一个带有子模块的项目的初始克隆之后(显然你在这之前没有这些子模块)。

根据戴夫·詹姆斯·米勒的回答,我可以证实它对我有效。 这里重要的是提交子项目提交ID。 只是在.gitmodules中的条目是不够的。

这是一个合适的提交:

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

和你一样,我发现git子模块同步并没有达到你期望的效果。 只有在做一个明确的git submodule add再次git submodule add子模块url更改。

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

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

而且我也在一些接收后的git部署脚本上使用相同的逻辑。

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

我有同样的问题。

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

原来,添加子模块的开发人员也将子模块目录添加到.gitignore文件中。 这是行不通的。

当我今天看到这个时,开发人员已经把树的一部分移到了一个新的子目录中,看起来好像他的git客户端没有在树中logging更新的子项目规则,而只是把.gitmodules ,留下了.gitmodules过时的位置以及当前树中不再存在的子项目。

重新添加子模块,并比较子模块的提交shas和在git show $breaking_commit_shafind的提交。 git show $breaking_commit_sha ^-Subproject (search匹配正则expression式^-Subproject )根据需要调整固定的东西。

我有一个子模块类似的问题。 它只是不想克隆/拉/更新/不pipe。

当试图重新添加子模块使用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

这在我的情况。

我今天有同样的问题,并发现,因为我键入的git submodule init然后我有我的.git/config这些行:

 [submodule] active = . 

我删除了并键入:

 git submodule update --init --remote 

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

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