【发布时间】:2011-08-15 06:14:20
【问题描述】:
我有一个带有 Git 子模块的项目。它来自 ssh://... URL,并在提交 A 上。提交 B 已被推送到该 URL,我希望子模块检索提交并更改为它。
现在,我的理解是git submodule update 应该这样做,但事实并非如此。它什么都不做(没有输出,成功退出代码)。这是一个例子:
$ mkdir foo
$ cd foo
$ git init .
Initialized empty Git repository in /.../foo/.git/
$ git submodule add ssh://user@host/git/mod mod
Cloning into mod...
user@host's password: hunter2
remote: Counting objects: 131, done.
remote: Compressing objects: 100% (115/115), done.
remote: Total 131 (delta 54), reused 0 (delta 0)
Receiving objects: 100% (131/131), 16.16 KiB, done.
Resolving deltas: 100% (54/54), done.
$ git commit -m "Hello world."
[master (root-commit) 565b235] Hello world.
2 files changed, 4 insertions(+), 0 deletions(-)
create mode 100644 .gitmodules
create mode 160000 mod
# At this point, ssh://user@host/git/mod changes; submodule needs to change too.
$ git submodule init
Submodule 'mod' (ssh://user@host/git/mod) registered for path 'mod'
$ git submodule update
$ git submodule sync
Synchronizing submodule url for 'mod'
$ git submodule update
$ man git-submodule
$ git submodule update --rebase
$ git submodule update
$ echo $?
0
$ git status
# On branch master
nothing to commit (working directory clean)
$ git submodule update mod
$ ...
我也尝试过git fetch mod,它似乎可以进行提取(但不可能,因为它没有提示输入密码!),但git log 和git show 否认存在新提交。到目前为止,我只是 rm-ing 模块并重新添加它,但这在原则上是错误的,在实践中也是乏味的。
【问题讨论】:
-
David Z 的回答似乎是这样做的更好方法 - 现在 Git 具有您通过
--remote选项内置的功能,也许将其标记为已接受的答案而不是有用的比杰森回答中的“手工”方法? -
我非常同意@MarkAmery。虽然 Jason 提供了一个可行的解决方案,但这并不是预期的方法,因为它会将子模块的提交指针留在错误的提交标识符处。新的
--remote在这个时间点绝对是一个更好的解决方案,并且由于这个问题已经链接到一个关于子模块的 Github Gist,我觉得新的读者看到新的答案会更好。 -
使用
hunter2密码很不错:o)
标签: git git-submodules git-pull