将子模块更新为最新提交

fat*_*fat 241 git git-submodules

我有一个项目A,它是一个库,它在项目B中使用.

项目A和B在github BUT上都有一个单独的存储库,我们有一个A的子模块.

我在库中编辑了一些类,这是在repo A中,我推送了远程仓库,所以我们更新了库(repo A).

这些更新不反映子模块引用先前提交的"引用"(子模块)....我应该怎么做才能更新git上的子模块?

Kju*_*uly 321

进入子模块目录:

cd projB/projA
Run Code Online (Sandbox Code Playgroud)

从你的项目A中拉出repo(不会更新你父项目的项目B的git状态):

git pull origin master
Run Code Online (Sandbox Code Playgroud)

返回根目录并检查更新:

cd ..
git status
Run Code Online (Sandbox Code Playgroud)

如果之前更新了子模块,它将显示如下内容:

# Not currently on any branch.
# Changed but not updated:
#   (use "git add ..." to update what will be committed)
#   (use "git checkout -- ..." to discard changes in working directory)
#
#       modified:   projB/projA (new commits)
#
Run Code Online (Sandbox Code Playgroud)

然后,提交更新:

git add projB/projA
git commit -m "projA submodule updated"
Run Code Online (Sandbox Code Playgroud)

  • 顺便说一句,如果你不是子模块的所有者,当别人更新projA时你可以做`git submodule update`(你会得到一个新的提交id). (35认同)
  • 仅更新一个子模块:`git submodule update --remote --merge <path-to-submodule>` (4认同)
  • @KR29 是的,完整的命令是`git push <remote> <branch>`,例如`git push origin dev`。 (2认同)
  • `git submodule update` 仅在拉取提交(在项目 B 中)并更新相关子模块(项目 A)的引用时才在没有标志的情况下工作。要更新项目 B 以引用项目 A 的远程跟踪分支的“HEAD”,您需要执行“git submodule update --remote --merge”,如下面 Paul Hatcher 的答案所示。 (2认同)

Pau*_*her 93

自从git 1.8你可以做到

git submodule update --remote --merge
Run Code Online (Sandbox Code Playgroud)

这会将子模块更新为最新的远程提交.然后,您需要提交更改,以便更新父存储库中的gitlink

git commit
Run Code Online (Sandbox Code Playgroud)

然后在没有这个的情况下推送更改,指向子模块的SHA-1标识将不会更新,因此其他任何人都无法看到更改.

  • 缺少这个答案(但在下面的其他答案中指出):更新的子模块需要在提交之前使用 `git add` 暂存。 (2认同)

Ada*_*ruk 37

如果更新子模块并提交它,则需要转到包含或更高级别的存储库并在其中添加更改.

git status
Run Code Online (Sandbox Code Playgroud)

将显示如下内容:

modified:
   some/path/to/your/submodule
Run Code Online (Sandbox Code Playgroud)

也可以看到子模块不同步的事实

git submodule
Run Code Online (Sandbox Code Playgroud)

输出将显示:

+afafaffa232452362634243523 some/path/to/your/submodule
Run Code Online (Sandbox Code Playgroud)

加号表示您的子模块指向顶部repo期望它指向的位置.

只需添加此更改:

git add some/path/to/your/submodule
Run Code Online (Sandbox Code Playgroud)

并提交它:

git commit -m "referenced newer version of my submodule"
Run Code Online (Sandbox Code Playgroud)

当您向上推动更改时,请确保先推送子模块中的更改,然后在外部仓库中推送参考更改.这样,更新的人将始终能够成功运行

git submodule update
Run Code Online (Sandbox Code Playgroud)

有关子模块的更多信息,请访问http://progit.org/book/ch6-6.html.


And*_*bov 19

单行版

git submodule foreach "(git checkout master; git pull; cd ..; git add '$path'; git commit -m 'Submodule Sync')"
Run Code Online (Sandbox Code Playgroud)


Kus*_*eth 8

解决方案1

为了简单起见。

运行此命令以获取最新的子模块:

git submodule update --remote --merge

or 

git submodule update --remote
Run Code Online (Sandbox Code Playgroud)

现在,我们需要更新父存储库中的引用,可以使用以下命令来完成:

git add <<submodulesfoldername>>
Run Code Online (Sandbox Code Playgroud)

注意: <> == 我的子模块文件夹的名称git add sub-modules(记住用你的代码提交和推送,最新提交的引用将被添加)

在此输入图像描述

解决方案2

如果上述解决方案无法获取最新版本,请尝试以下操作:

git submodule update --init --recursive
Run Code Online (Sandbox Code Playgroud)


Fra*_*rzi 6

上述答案都不适合我。

这是解决方案,从目录运行:

git submodule update --init;
cd submodule-directory;
git pull;
cd ..;
git add submodule-directory;
Run Code Online (Sandbox Code Playgroud)

现在你可以git commit并且git push