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

时间:2015-09-03 15:11:31

标签: git git-submodules

我已经从别人手中接过了一个项目,我很难让回购再次运行。这可能听起来很基本,但这是我的问题:

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

git submodule init
git submodule update

它创建了该项目所基于的外部存储库的链接。现在,如果我想保留这段代码的最后一个版本并删除.git(因为我们很快将它发布到公共场所并且不想分享我们的git脚印)并且仍然有“git submodule”工作,我该怎么办需要做?除了.git之外,在项目文件夹中还有一个名为“.gitmodules”的文件,其中包含指向外部存储库的链接。但是当我“rm -rf .git”并执行一个新的git init来初始化一个新的git副本时,“git submodule init”和“git submodule update”不会做任何事情。我应该做些什么来在.git和我保存在文件夹中的“.gitmodules”文件之间建立链接吗?

2 个答案:

答案 0 :(得分:1)

如果删除.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)

答案 1 :(得分:0)

要删除/删除.git目录,只需删除.git目录并重新启动。

(删除.git文件夹后,子模块的命令将无效,因为.gitmodules.git文件夹一起被删除 现在你将实现任务1:擦除git目录

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

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

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

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

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