git子模块毁了我的一天

时间:2011-06-05 10:02:26

标签: git terminal command-line-interface git-submodules dir

目前我正在尝试将这个git repo:https://github.com/twilio/OpenVBX克隆到我的主仓库中,好像它是一个目录。问题在于,当我尝试使用git add。提交主repo时,sub dir(子模块)中没有任何内容被提交,当我尝试git add path / to / file时,它给了我致命的错误: “路径”“在子模块中”。似乎git没有跟踪子目录,也没有注意到它及其文件存在。

我环顾四周并发现了这个帖子:Unable to track files within Git submodules但是,其中的修复似乎与我无关或我对git的知识有限。我的main中没有任何.gitmodules文件,而我所知道的.git目录与我所知道的无关。有没有办法可以让它不再是子模块?有没有我可以删除它,并在没有它的git主干的情况下读取它?

我现在不仅仅是失去了,先谢谢你的帮助!

3 个答案:

答案 0 :(得分:4)

如果您想保留历史记录以及提取后续更改的功能,可以使用git subtree merge strategy

git remote add -f OpenVBX git://github.com/twilio/OpenVBX.git
git merge -s ours --no-commit OpenVBX/master
git read-tree --prefix=OpenVBX/ -u OpenVBX/master
git commit -m "Merge OpenVBX in subdirectory"

当你想拉开OpenVBX时:

git pull -s subtree OpenVBX master

答案 1 :(得分:2)

如果要将OpenVBX克隆到存储库中并且不关心其先前的历史记录,请执行以下操作:

rm -rf OpenVBX
git clone https://github.com/twilio/OpenVBX.git
rm -rf OpenVBX/.git
git add OpenVBX
git commit -m "Import OpenVBX version x.y"

关键点是rm -rf OpenVBX/.git,它从OpenVBX中删除.git存储库信息。其余部分是正常添加和提交文件。

答案 2 :(得分:2)

据我了解,我认为您的问题是您没有正确地使用子模块。这里有两种情况:

1)您希望将OpenVBX存储库用作repo中的模块,但您无意更改OpenVBX存储库本身的代码,也就是说,您将“按原样”使用库而不进行修改它。在这种情况下,您需要做的就是:

git submodule add git://github.com/twilio/OpenVBX.git plugins/OpenVBX

其中plugins / OpenVBX是您希望在自己的存储库中添加它的路径。例如,我在我的设置上执行了这些步骤,它的外观如下:

~/Personal$ mkdir test
~/Personal$ cd test/
~/Personal/test$ echo "Test repo for playing around with submodules" > README
~/Personal/test$ mkdir plugins
~/Personal/test$ echo "I'll keep my plugins here" > plugins/README
~/Personal/test$ git init
Initialized empty Git repository in /home/vedang/Personal/test/.git/
~/Personal/test$ git add .
~/Personal/test$ git commit -m "Initial commit"
[master (root-commit) 4539047] Initial commit
 2 files changed, 2 insertions(+), 0 deletions(-)
 create mode 100644 README
 create mode 100644 plugins/README
~/Personal/test$ git submodule add git://github.com/twilio/OpenVBX.git plugins/OpenVBX
Initialized empty Git repository in /home/vedang/Personal/test/plugins/OpenVBX/.git/
remote: Counting objects: 2055, done.
remote: Compressing objects: 100% (1315/1315), done.
remote: Total 2055 (delta 1132), reused 1430 (delta 695)
Receiving objects: 100% (2055/2055), 4.96 MiB | 25 KiB/s, done.
Resolving deltas: 100% (1132/1132), done.
~/Personal/test$ git add .gitmodules
~/Personal/test$ git add plugins/OpenVBX
~/Personal/test$ git commit -m "Added openvbx as a submodule"
[master 5318022] Added openvbx as a submodule
 2 files changed, 4 insertions(+), 0 deletions(-)
 create mode 100644 .gitmodules
 create mode 160000 plugins/OpenVBX
~/Personal/test$ git log -p
commit 5318022936429a34cabddfeedc3574f7744127c3
Author: Vedang Manerikar 
Date:   Sun Jun 5 16:04:11 2011 +0530

Added openvbx as a submodule

diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..bbde679 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "plugins/OpenVBX"] + path = plugins/OpenVBX + url = git://github.com/twilio/OpenVBX.git diff --git a/plugins/OpenVBX b/plugins/OpenVBX new file mode 160000 index 0000000..ade10d8 --- /dev/null +++ b/plugins/OpenVBX @@ -0,0 +1 @@ +Subproject commit ade10d86fd9556e840f337c255037c163facd2a3

正如您所看到的,对于git,子模块只是一个指向某个其他存储库中某些SHA的commit-id。它不关心子模块目录的结构。

2)如果您还想修改子模块中的代码,唯一的主要区别是您应该对要添加为子模块的存储库具有写权限。在github上,这就像分叉父存储库一样简单,并使用forked repo作为子模块。在这种情况下,git也会将您的子模块视为主存储库中的SHA。但是,如果你在子模块目录(在我们的例子中是plugins / OpenVBX)中执行git状态,你将能够在那里提交你的更改并将它们推送到子模块库。

使用子模块比将源代码复制到存储库中有一些优势。主要优点是您可以与原始库保持同步,并从其他代码和错误修复中受益。我建议您在放弃子模块之前再尝试使用子模块。