2

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

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

我现在不仅仅是迷路了,在此先感谢您的帮助!

4

3 回答 3

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
于 2011-06-05T12:06:49.397 回答
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"

关键点是从 OpenVBXrm -rf OpenVBX/.git中删除存储库信息。.git剩下的就是照常添加和提交文件。

于 2011-06-05T10:12:01.027 回答
2

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

1) 您想将 OpenVBX 存储库用作存储库中的模块,但您无意更改 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 的提交 ID。它不关心子模块目录的结构。

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

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

于 2011-06-05T10:50:03.767 回答