使用`git子模块更新`
假设我有使用`git子模块更新`,git,Git,假设我有project\u a(git-repo),其中包含文件和另一个project\u b(git-repo) 正如本书所示,我可以运行: cd project_a git submodule init git submodule update // clones project_b repo specified in '.gitsubmodules' 填充project\u a中最初为空的project\u b目录 我宁愿在某个时间点克隆project\b的最新版本,然后让project
project\u a
(git-repo),其中包含文件和另一个project\u b
(git-repo)
正如本书所示,我可以运行:
cd project_a
git submodule init
git submodule update // clones project_b repo specified in '.gitsubmodules'
填充project\u a
中最初为空的project\u b
目录
我宁愿在某个时间点克隆project\b
的最新版本,然后让project\a
只使用该版本(当然,除非我在project\b
中执行git pull
)
我该怎么做呢?您所描述的正是子模块在git中是如何工作的。如果不更新子模块的哈希并将其签入到
project\u a
,您将始终使用相同版本的project\u b
这是引入子模块时应使用的方法:
cd项目a
git子模块添加https://url/to/repository 相对/路径/到/保存/存储库/到
cd相对/path/to/save/repository/to
git签出所需的\u提交
cd-
(返回上一个目录)git添加相对/path/to/save/repository/to
git commit
(无论何时提交到父目录,它都会记录所有子模块都处于启用状态的当前提交)如果您想随时更改子模块的提交,您只需更改到该目录并像正常情况一样处理它。只需确保您始终将其置于推送到其原点的提交上。否则,您可能会遇到这样一种情况:父存储库指向的提交在实际存储库中不存在。因此,如果我执行以下操作:(1)生成
project\u a
(2)git子模块add project\u b
(3)git add.gittributes project\u b
(4)git commit-m“added project\u b repo”
(5)git推送原始主机
。然后,任何git克隆项目a
,后跟git子模块init&&git子模块update
都将具有相同的原始项目b
?(即使project\u b的官方回购协议还有5次提交)?是的,这就是会发生的。因此,如果我想包括project\u b
中的5次更新,我需要(1)cd到project\u a/project\u b
(2)git pull origin master
(3)cd.
(4)git commit-m“从project\u b获得最新版本”
(5)git推送原始主机
?然后,任何执行git clone project\u a&&cd project\u a&&git submodule init&&git submodule update
的人都将拥有一个project\u b
项目,包括这5项更改?对于那些git clone
父报告必须运行git submodule update
的人来说,这似乎是一件麻烦事。但我想没有别的选择了,对吧?没错。如果您经常使用子模块,那么在新的克隆之后这样做就成了第二天性。而且,克隆一个新的repot对于大多数人来说并不是一项很常见的任务。如果您想让它变得简单一点,可以在父repot的“setup”脚本中包含必要的命令。
cd project_a
git submodule init
git submodule update // clones project_b repo specified in '.gitsubmodules'