如何将子模块添加到子目录?
我在~/.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作为前缀 。这对于shell脚本来说很有用,我们可能想要
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
干杯