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忽略init
和update
命令,什么都不做。
怎么修
- 你的子模块文件夹应该被提交到git仓库
- 它不应该在.gitignore
如果满足这个要求,它就会起作用。 否则,所有的命令都会执行而没有任何消息和结果。
如果你做到了这一切,但仍然行不通:
- 手动添加子模块,例如
git submodule add git@... path/to
-
git submodule init
-
git submodule update
- 提交并推送所有文件 –
.gitmodules
和你的模块文件夹(注意,文件夹的内容将不会提交) - 放弃您的本地git回购
- 克隆一个新的
- 确保
.git/config
还没有任何子模块 - 现在,
git submodule init
– 你会看到一个消息,该模块注册 -
git submodule update
– 将获取模块 - 现在看看
.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_sha
find的提交。 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 ...
可能会解决问题。