将子模块更新为最新提交

时间:2011-11-19 02:03:22

标签: git git-submodules

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

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

我在库中编辑了一些类,这是在repo A中,我推动了远程仓库,因此更新了库(repo A)。

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

8 个答案:

答案 0 :(得分:290)

输入子模块目录:

cd projB/projA

从您的项目A中拉出回购(将更新您的父项目的项目B的git状态):

git pull origin master

返回根目录&检查更新:

cd ..
git status

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

# 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)
#

然后,提交更新:

git add projB/projA
git commit -m "projA submodule updated"

答案 1 :(得分:75)

从git 1.8开始,你可以做到

git submodule update --remote --merge

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

git commit

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

答案 2 :(得分:35)

如果你更新一个子模块并提交它,你需要转到包含或更高级别的repo并在那里添加更改。

git status

会显示如下内容:

modified:
   some/path/to/your/submodule

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

输出将显示:

+afafaffa232452362634243523 some/path/to/your/submodule

加号表示您的子模块指向顶部仓库所指向的位置。

只需添加此更改:

git add some/path/to/your/submodule

并提交:

git commit -m "referenced newer version of my submodule"

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

git submodule update

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

答案 3 :(得分:18)

单行版

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

答案 4 :(得分:1)

其他一些建议建议在子模块目录中进行合并/提交,这会使IMO变得有些混乱。

假设远程服务器名为origin,并且我们想要子模块的master分支,我倾向于使用:

git submodule foreach "git fetch && git reset --hard origin/master"

注意:这将在每个子模块上执行硬重置-如果您不希望这样做,则可以将--hard更改为--soft

答案 5 :(得分:0)

我的项目应该使用子模块的'latest'。在Mac OSX 10.11,git版本2.7.1上,我不需要进入我的子模块文件夹以收集其提交。我只是做了一个常规的

git pull --rebase 

在顶层,它正确更新了我的子模块。

答案 6 :(得分:0)

Andy的回答通过转义$ path对我有用:

<form action="{{ route('checkout.post') }}" method="post" id="checkout-form">
  <label for="card-element">Credit or debit card</label>
  <div id="card-element"></div>
  {{ csrf_field() }}
  <button class="btn btn-success">Submit</button>
</form>

答案 7 :(得分:0)

以上答案均不适合我。

这是解决方案,在父级目录中运行:

git submodule update --init;
cd submodule-directory;
git pull;
cd ..;
git add submodule-directory;

现在您可以git commitgit push