如何在新存储库中使用 git 子模块?

how to work with git submodule in a new repository?

我已经从其他人那里得到了一个项目,但我很难启动回购协议 运行。这听起来可能很基础,但这是我的问题:

所以我克隆了项目,我需要做

git submodule init
git submodule update

并创建 link 到此项目所基于的外部存储库。现在,如果我想保留此代码的最新版本并删除 .git(因为我们将很快将其发​​布到 public,并且不想分享我们的 git 足迹)和"git submodule" 仍然有效,我需要做什么?在项目文件夹中,除了 .git 之外,还有一个名为“.gitmodules” 的文件,其中包含指向外部存储库的 links。但是当我 "rm -rf .git" 并执行一个新的 git init 来初始化一个新的 git 副本时,"git submodule init" 和 "git submodule update" 什么都不做。我是否应该做一些其他事情来在我保存在文件夹中的 .git 和“.gitmodules”文件之间创建一个 link?

如果您删除 .git 目录并使用 git init 创建一个新目录,您将需要 运行 git submodule add 重新注册子模块。例如,这里我们有一个包含一些子模块的存储库:

bash-4.3$ git submodule
 460317a37795e0751ecc788e571a11fc1a908079 bar (heads/master)
 460317a37795e0751ecc788e571a11fc1a908079 foo (heads/master)

如果我们删除 git 历史并重新初始化存储库:

bash-4.3$ rm -rf .git
bash-4.3$ git init
Initialized empty Git repository in /home/lars/tmp/repo/.git/

此时,git 没有看到子模块:

bash-4.3$ git submodule
bash-4.3$ 

即使他们还在那里:

bash-4.3$ ls
bar  foo

我们可以使用 git submodule add:

重新注册它们
bash-4.3$ git submodule add git@myserver:path/to/repo/foo foo
Adding existing repo at 'foo' to the index
bash-4.3$ git submodule add git@myserver:path/to/repo/bar bar
Adding existing repo at 'bar' to the index

他们回来了:

bash-4.3$ git submodule
 460317a37795e0751ecc788e571a11fc1a908079 bar (heads/master)
 460317a37795e0751ecc788e571a11fc1a908079 foo (heads/master)

到remove/erase.git目录,直接删除.git目录,重新初始化即可。

(一旦删除 .git 文件夹,子模块的命令将不起作用,因为 .gitmodules.git 文件夹一起被删除) 现在您将完成 任务 1:删除 git 目录

要将子模块添加到存储库,请使用命令 git submodule add

示例:git submodule add https://github.com/chaconinc/DbConnector

如果此时你 运行 git status,你会注意到一些事情。 首先,您应该注意到新的 .gitmodules 文件。这是一个配置文件,用于存储项目 URL 和您将其拉入的本地子目录之间的映射。

(如果你有多个子模块,你将在这个文件中有多个条目。重要的是要注意这个文件与你的其他文件一样是版本控制的,比如你的 .gitignore 文件。它是与项目的其余部分一起推送和拉取。这就是克隆该项目的其他人如何知道从哪里获取子模块项目。)

现在,您将完成 任务 2:像以前一样使用子模块