如何将 Git 子模块添加到子目录?

问题描述 投票:0回答:6

我在

~/.janus/
有一个 Git 存储库,其中有一堆子模块。我想在
~/.janus/snipmate-snippets/snippets/
中添加子模块,但是当我在
git submodule add <[email protected]:...>
目录中运行
snipmate-snippets
时,收到以下错误消息:

You need to run this command from the top level of the working tree.

所以问题是:如何向

snipmate-snippets
目录添加子模块?

git git-submodules
6个回答
632
投票

你进入

~/.janus
并运行:

git submodule add <git@github ...> snipmate-snippets/snippets/

如果您需要有关子模块(或一般的 git)的更多信息ProGit非常有用。


108
投票

请注意,从 git1.8.4(2013 年 7 月)开始,您不必再返回根目录。

 cd ~/.janus/snipmate-snippets
 git submodule add <git@github ...> snippets

Bouke Versteegh 评论,你不必使用

/.
,如
snippets/.
snippets
就足够了)

参见提交091a6eb0feed820a43663ca63dc2bc0bb247bbae

子模块:删除顶级需求

使用新的

rev-parse --prefix
选项处理给定子模块命令的所有路径,放弃从存储库顶层运行它的要求。

由于相对子模块 URL 的解释取决于是否配置“

remote.origin.url
”,因此当不在工作树的顶层时,显式阻止“
git submodule add
”中的相对 URL。

签署人:John Keeping

取决于提交12b9d32790b40bf3ea49134095619700191abf1f

这使得“

git rev-parse
”的行为就像从存储库的指定子目录调用它一样,不同之处在于它打印的任何文件路径都以工作树顶部的完整路径为前缀

这对于 shell 脚本很有用,我们可能想要

cd
到达工作树的顶部,但需要处理用户在命令行上给出的相对路径。


26
投票

对于那些和我一样喜欢手动编辑配置文件的人来说,添加(或修改)以下内容也可以解决问题。

.git/config(个人配置)

[submodule "cookbooks/apt"]
    url = https://github.com/opscode-cookbooks/apt

.gitmodules(提交的共享配置)

[submodule "cookbooks/apt"]
    path = cookbooks/apt
    url = https://github.com/opscode-cookbooks/apt

也看到这个 - .gitmodules 和在 .git/config 中指定子模块之间的区别?


21
投票

我也遇到了类似的问题,但用 GUI 工具把自己逼到了墙角。

我有一个子项目,其中有一些文件,到目前为止我只是复制这些文件,而不是检查他们自己的 git 存储库。我在子文件夹中创建了一个存储库,能够很好地提交、推送等。但在父存储库中,子文件夹并未被视为子模块,并且其文件仍在由父存储库跟踪 - 不好。

为了摆脱这种混乱,我必须 告诉 Git 停止跟踪子文件夹(不删除文件):

proj> git rm -r --cached ./ui/jslib

然后我不得不告诉它那里有一个子模块(如果 git 当前正在跟踪任何内容,则无法执行此操作):

proj> git submodule add ./ui/jslib

更新

处理此问题的理想方法还包括几个步骤。理想情况下,现有的存储库被移出到它自己的目录,没有任何父 git 模块,提交并推送,然后添加为子模块,例如:

proj> git submodule add [email protected]:user/jslib.git ui/jslib

这会将 git 存储库克隆为子模块 - 这涉及标准克隆步骤,但也涉及 git 代表您执行的其他一些更晦涩的配置步骤,以使该子模块正常工作。最重要的区别是,它在那里放置一个简单的 .git 文件,而不是 .git 目录,其中包含对真实 git 目录所在位置的路径引用 - 通常位于父项目根目录 .git/modules/jslib 处。

如果你不这样做,他们会为你工作得很好,但是一旦你提交并推动父母,而另一个开发人员去拉那个父母,你只会让他们的生活变得更加困难。只要您在包含自己的 .git 目录的目录的子文件夹中拥有完整的 .git 目录,他们就很难复制您计算机上的结构。

所以,移动、推送、git add 子模块,是最干净的选择。


2
投票

单行 bash 脚本可帮助实现 Chris 上面的答案,因为我也使用 Vundle 更新我的 .vim 脚本,将自己画在了角落里。

DEST
是包含子模块的目录的路径。 做完之后再做这个
git rm -r $DEST

DEST='path'; for file in `ls ${DEST}`; do git submodule add `grep url ${DEST}/${file}/.git/config|awk -F= '{print $2}'` ${DEST}/${file}; done

干杯


0
投票

我最近启动了一个名为 SRM 的项目,旨在简化 Git 子模块之外的子存储库管理。我在这篇 Medium 文章中分享了我对 SRM 的想法和详细信息,这可能会对那些寻找替代存储库管理解决方案的人感兴趣。 https://medium.com/@eng.jafari.m/simplifying-subrepository-management-with-super-repo-manager-srm-beyond-git-submodules-and-dd5f85d69bab

© www.soinside.com 2019 - 2024. All rights reserved.