将 git 存储库更新为子模块

Update git repository to submodule

小问题,我可以将子模块用作“克隆存储库”吗?

例如:
我可以更改子模块分支,以防万一,编辑代码并在其中做一些工作并提交它们吗?

示例:

 > example-repo
   |- index.html
   |- submodule -> submodule-repo-1
   |  |- file1.html
   |- submodule -> submodule-repo-2
      |- file2.html

然后做类似的事情:

git clone https://.../example-repo.git
git submodule update
cd submodule-repo-1
git checkout -b test-branch
echo "idk" > file1.html
git commit -am "test commit"
git push

是的,你确实可以做到。记住——至少现在1——一个子模块并不真正“知道”它一个子模块,所以一旦你cd 并启动 运行ning Git 命令(git checkoutgit add 等),您只是在一个普通的 Git 存储库中工作.使这个 Git 存储库 成为 子模块的原因是,一旦你退出它回到 超级项目 ,某些 Git 命令 in 超级项目将 运行:

(cd submodule && git checkout $hash)

例如特定的哈希 ID。

因此,在您对子模块的工作树进行更改后,最好先提交它们,然后在其他地方 git push-ed,以免超级项目做一些疯狂的事情,例如 运行 git checkout,或者真的疯狂地想完全删除子模块。2


1Git 中正在进行的工作是让子模块更加意识到它们 子模块,以帮助修复项目像脚注 2.

2这很危险,所以我们通常不想要它,但是:会发生什么,例如,如果 path/to/X 提交 a1234567 是子模块,但是提交 b789abc 中的 path/to/X 是普通文件? Git 努力不破坏子模块(或其克隆)——如今,子模块存储库被移动到超级项目中的 .git/modules/ 目录——但这可能是必要的。