【问题标题】:Is it possible to specify which commits to clone with git submodules?是否可以指定要使用 git 子模块克隆哪些提交?
【发布时间】:2022-11-16 22:04:52
【问题描述】:

我正在使用 .gitmodules 文件为我的主仓库指定一个 git 子模块:

[submodule "SUBMODULE"]
    path = ...
    url = ...

然后在命令行中:git clone MAINREPO --recursive

是否可以指定要签出子模块的哪个提交在克隆命令中

【问题讨论】:

  • 您的意思是与顶级回购中承诺的不同?
  • 是的,历史上任何一个特定的

标签: git git-submodules


【解决方案1】:

对你的问题的简短回答是:没办法。信息写在提交的超级项目中,存储有关子模块更改的信息。每次跑

git clone --recursive superproject-url

或者

git checkout --recursive some-old-commit

Git 在 HEAD 中查找子模块的提交或正在检出的旧提交并检出存储的子模块提交。

如果你想更改存储在 HEAD 中的提交:转到本地克隆的子模块,检查提交,返回到超级项目,添加并提交子模块中的更改,推送:

cd subdir
git checkout branch-tag-or-ID
cd .. # back to the superproject
git add subdir
git commit -m "Change in subdir" subdir

如果要更改为的子模块中的提交是 HEAD,则可以在超级项目中执行

git submodule update --remote subdir
git commit -m "Change in subdir" subdir

除了命令行选项,您还可以执行(使用 shell 脚本或 git 别名)git clone --recursive && cd subdir && git checkout commit-ID。这是唯一的方法。就像是

# .gitconfig
[alias]
clone-sub = "!f() { git clone --recursive "$1" && cd "$2" && git checkout "$3"; }; f"

用法:git clone-sub superproject-url submodule-name commit-ID

【讨论】:

  • 谢谢,但这并不能真正回答我的问题。我想知道是否有一个命令标志/hack 可以添加,这样克隆的超级项目将包含指定提交的子模块。有一次我用后者的XXX版本克隆,2分钟后我用后者的YYY版本克隆。所有这些都从命令行参数化。
  • 你的问题的答案是:不可能。子模块的提交存储在超级项目中。改变它的唯一方法是提交并推送超级项目。随着更改.gitmodules,您无论如何都必须提交并推送。您可以(使用 shell 脚本或 git 别名)git clone --recursive && cd subdir && git checkout commit-ID 而不是任何命令行选项。这是唯一的方法。
  • 好的,您能否将上面的评论附加到答案中以便我接受?
  • @maciek 完成。我还为这样的别名添加了草稿。
猜你喜欢
  • 1970-01-01
  • 2011-11-04
  • 2021-03-02
  • 1970-01-01
  • 2014-01-06
  • 1970-01-01
  • 1970-01-01
  • 2011-10-19
  • 2016-09-01
相关资源
最近更新 更多