为什么git告诉我子模块的路径被忽略了?
The following path is ignored by one of your .gitignore files:
multi/vim/.vim/bundle/powerline
Use -f if you really want to add it.
这就是我正在做的事情:
$ git subaddvim git://github.com/Lokaltog/vim-powerline.git powerline
The following path is ignored by one of your .gitignore files:
multi/vim/.vim/bundle/powerline
Use -f if you really want to add it.
$ git help subaddvim
`git subaddvim' is aliased to `!f(){ [ $# -eq 2 ] && git submodule add $1 multi/vim/.vim/bundle/$2; };f'
修改:看起来像是p
owerline中的p
:
$ git subaddvim git://github.com/Lokaltog/vim-powerline.git p
The following path is ignored by one of your .gitignore files:
multi/vim/.vim/bundle/p
Use -f if you really want to add it.
$ git subaddvim git://github.com/Lokaltog/vim-powerline.git owerline
Cloning into 'multi/vim/.vim/bundle/owerline'...
我不明白为什么。
编辑2 :我在子模块克隆目标中找到了一个文件:
multi/vim/.vim/bundle$ cat powerline/.git
gitdir: ../.git/modules/multi/vim/.vim/bundle/powerline
如果我将其删除并重试,我会收到其他错误:
$ git subaddvim git://github.com/Lokaltog/vim-powerline.git powerline
fatal: Not a git repository: ../.git/modules/multi/vim/.vim/bundle/powerline
Unable to checkout submodule 'multi/vim/.vim/bundle/powerline'
也许有些东西搞砸了我的.git? (我昨天克隆了这个回购,然后又恢复了这个改变。)
编辑3 :我尝试直接使用git submodule
(而不是我的别名)并且它有效!我可以通过在克隆之后执行git reset --hard
来重新创建问题(有时)。好像它是我的别名的组合,不像git命令git一样忽略.git
文件(或做一些我不理解的魔法)。也许与我的.git / config有关,参考powerline。
编辑4 :我以前的编辑不明确:虽然直接使用git submodule
。它并不总是有效。我不知道它为什么会起作用。
我把它缩小到一个可重复的案例。看起来这个问题是由git引起的,假设子模块在根目录中。这是我的测试脚本。
if [ ! -d remote ] ; then
echo
echo Setup remote test repo
mkdir remote
cd remote
git init
touch firstfile
git add firstfile
git ci -m'first'
cd -
fi
# Pick one of these lines:
submodule=multi/plugin
# OR
submodule=plugin
echo
echo Setup test repo
mkdir test
cd test
git init
touch firstfile
git add firstfile
git ci -m'first'
echo
echo submodule add
git submodule add ../remote $submodule
ls -ld $submodule/.git
cat $submodule/.git
echo
echo submodule remove
git reset --hard HEAD
ls -ld $submodule/.git
cat $submodule/.git
rm -r $submodule/
echo
echo submodule re-add
git submodule add ../remote $submodule
ls -ld $submodule/.git
cat $submodule/.git
使用submodule=multi/plugin
将失败:
submodule re-add
fatal: Not a git repository: ../.git/modules/multi/plugin
Unable to checkout submodule 'multi/plugin'
-rw-r--r-- 1 pydave mkgroup 37 Aug 1 10:08 multi/plugin/.git
gitdir: ../.git/modules/multi/plugin
(在此之后,如果您运行git submodule add
,您将收到“忽略以下路径”消息。)
但submodule=plugin
会成功:
submodule re-add
-rw-r--r-- 1 pydave mkgroup 31 Aug 1 10:07 plugin/.git
gitdir: ../.git/modules/plugin
当子模块位于git项目的根目录中时,相对路径都使用../.git
,这只适用于第二个选项。
我已将此问题重命名为更具体针对我的问题和re-asked the original question。
答案 0 :(得分:1)
我认为答案是当使用不在顶级目录中的子模块时,git中存在一个错误。
解决方法是删除.git/modules
中存储的子模块的git repo:
$ rm -fr multi/plugin/ .git/modules/multi/plugin/
$ git submodule add ../remote multi/plugin
Cloning into 'multi/plugin'...
done.
答案 1 :(得分:0)
出于这个原因,我会远离git别名,并依靠bash历史来记住你之前输入的内容。您可以使用CTRL-R
和其他bash命令行优点来调用复杂的单行。看到你在做什么有助于意识到别名隐藏的内容。走到另一台机器上,你有一个问题,因为你忘了你的别名到底有什么了!