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

我在~/.janus/有一堆子模块的git repo。 我想在~/.janus/snipmate-snippets/snippets/添加一个子模块,但是当我运行git submodule add <git@github.com:...>时,在snipmate-snippets目录中git submodule add <git@github.com:...> ,出现以下错误信息:

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

所以问题是:如何添加一个子模块到snipmate-snippets目录?

你进入~/.janus并运行:

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

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

请注意,启动git1.8.4 (2013年7月),你不必回到根目录了。

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

( Bouke Versteegh 评论说你不必使用/. ,就像snippets/. /。:snippets就够了)

参见提交091a6eb0feed820a43663ca63dc2bc0bb247bbae :

子模块:删除最高级别的要求

使用新的rev-parse --prefix选项来处理给予子模块命令的所有path,从而放弃了从存储库的顶层运行的要求。

由于相对子模块URL的解释取决于是否configuration了“ remote.origin.url ”,因此当不在工作树的顶层时,显式地阻塞“ git submodule add ”中的相对URL。

签名:John Keeping

取决于提交12b9d32790b40bf3ea49134095619700191abf1f

这使得' git rev-parse '的行为就好像它是从一个存储库的指定子目录中调用的,区别在于它打印的任何文件path都以工作树顶部的完整path作为前缀

这对于s​​hell脚本来说很有用,我们可能想要cd到工作树顶部,但是需要处理用户在命令行上给出的相对path。

我遇到过类似的问题,但是用GUI工具把自己弄到了一个angular落。

我有一个子项目,里面有几个文件,我到目前为止只是复制,而不是检查自己的git回购。 我在子文件夹中创build了一个回购,能够承诺,推等,就好了。 但在父回购中,子文件夹不被视为子模块,其文件仍由父回购进行跟踪 – 不行。

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

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

然后,我不得不告诉它那里有一个子模块(如果有什么东西正在被git跟踪的话,你不能这样做):

 proj> git submodule add ./ui/jslib 

更新

处理这个问题的理想方法涉及更多的步骤。 理想情况下,现有的repo被移出到自己的目录,没有任何父git模块,提交和推送,然后添加为一个子模块,如:

 proj> git submodule add git@bitbucket.org:user/jslib.git ui/jslib 

这将克隆作为一个子模块的git仓库 – 这涉及到标准的克隆步骤,但也有一些其他更模糊的configuration步骤,git代表你的子模块工作。 最重要的区别在于它放置了一个简单的.git文件,而不是一个.git目录,它包含一个path引用,指向真正的git目录所在的位置 – 通常位于父项目根目录.git / modules / jslib。

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

所以,移动,推,git添加子模块,是最干净的select。

对于那些分享我手工编辑configuration文件的奇怪喜好的人来说,添加(或修改)以下内容也是可以的。

.git / config (个人configuration)

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

.gitmodules (提交共享configuration)

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

也可以看看这个.gitmodules和在.git / config中指定子模块的区别吗?

单线程bash脚本来帮助克里斯的答案上面,因为我已经画了自己在一个angular落以及使用Vundle更新我的.vim脚本。 DEST是包含子模块的目录的path。 做完后,做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 

干杯