【问题标题】:How do I "commit" changes in a git submodule? [duplicate]如何在 git 子模块中“提交”更改? [复制]
【发布时间】:2011-04-04 18:51:54
【问题描述】:

我天真地设置了一个 git 子模块并将其视为外部的 Subversion - 即它现在充满了我刚刚意识到尚未提交或推送到任何地方的更改。

是否有一些简单的方法可以将子模块更改提交/推送回上游仓库?在 Git 中以这种方式在单独(但链接)的存储库上进行同步开发的推荐技术是什么?

【问题讨论】:

标签: git git-submodules


【解决方案1】:

一个子模块是它自己的repo/work-area,有它自己的.git目录。

所以,首先commit/push 您的子模块 发生变化:

$ cd path/to/submodule
$ git add <stuff>
$ git commit -m "comment"
$ git push

然后,更新您的主项目以跟踪子模块的更新版本:

$ cd /main/project
$ git add path/to/submodule
$ git commit -m "updated my submodule"
$ git push

【讨论】:

  • 除了git似乎有时将子模块放入匿名分支中...$ git.exe b -a *(无分支)
  • @rogerdpack - 你是对的。子模块通常以“无分支”结束。在添加/提交到子模块之前,您通常需要检查一些分支。
  • 即使这被标记为重复,+1 因为你的答案比另一个更清楚
  • 另外值得注意的是,如果您在输入 git status 时看到 HEAD detached at ...,则在从 github 超级项目中的文件树创建子模块后,您可能需要 git checkout master
  • 这为我修复了 git push origin HEAD:master
【解决方案2】:

请注意,如果您在各个子模块中提交了一堆更改,您可以(或很快能够)一次性完成所有内容(即一次来自父仓库),带有:

git push --recurse-submodules=on-demand

git1.7.11 ([ANNOUNCE] Git 1.7.11.rc1) 提到:

git push --recurse-submodules”学会了选择性地查看绑定到超级项目的子模块的历史并将它们推出。

可能在this patch--on-demand 选项之后完成:

--recurse-submodules=<check|on-demand|no>::

确保要推送的修订所使用的所有子模块提交在远程跟踪分支上可用。

  • 如果使用check,将检查所有在要推送的修订中更改的子模块提交是否在远程可用。
    否则推送将被中止并以非零状态退出。
  • 如果使用on-demand,所有在要推送的修订中发生变化的子模块都将被推送。
    如果按需无法推送所有必要的修订,它也将被中止并以非零状态退出。

此选项仅适用于一层嵌套。不会推送对另一个子模块内部的子模块的更改。

【讨论】:

  • 这对我不起作用:我必须这样做:
  • git submodule foreach git push -u origin master
  • @rivanov 你用的是什么版本的 Git?
【解决方案3】:
$ git submodule status --recursive

在这种情况下也是救生员。您可以使用它和 gitk --all 来跟踪您的 sha1 并验证您的子模块是否指向您认为的内容。

【讨论】:

  • 执行该命令后可以用tortoiseGit提交子模块。
【解决方案4】:

您可以像对待普通存储库一样对待子模块。要向上游传播您的更改,只需像往常一样在该目录中提交和推送。

【讨论】:

  • 对我来说这是最好的答案。如果您像对待任何其他 git repo 一样对待它,则无需记住任何新命令!只需 cd 进入子模块的目录并:git add -A git commit -m "some message" git push 然后 cd 到主仓库并执行相同操作。
  • ...除了我的普通存储库没有分离头。
  • 这似乎还不够完整。如果您 cd submod; git commit -am'New stuff'; git push 将新提交推送到子模块的源,但它不会在父项目中记录新的 SHA。官方文档甚至没有提到如何做到这一点。我怀疑它是(在父项目中):git add submod; git commit -m'Updated submod'; git push.
【解决方案5】:

在提交和推送之前,您需要为子模块初始化一个工作存储库树。 我正在使用乌龟并做以下事情:

首先检查是否存在.git文件(不是目录)

  • 如果有这样的文件,它包含超级模块 git 目录的路径
  • 删除此文件
  • 做 git init
  • 执行 git 添加远程路径用于子模块的路径
  • 按照以下说明进行操作

如果有 .git 文件,那么肯定有 .git 目录来跟踪本地树。 您仍然需要一个分支(您可以创建一个)或切换到 master(有时不起作用)。 最好的做法是 - git 获取 - 混帐拉。不要省略 fetch。

现在您的提交和拉取将与您的源/主同步

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-06-13
    • 2019-07-11
    • 2022-08-14
    • 2018-04-27
    • 2016-08-15
    • 2012-06-06
    • 2017-04-11
    • 1970-01-01
    相关资源
    最近更新 更多