为什么git告诉我我删除的子模块被忽略了?

时间:2012-07-31 21:49:33

标签: git git-submodules

为什么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

2 个答案:

答案 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命令行优点来调用复杂的单行。看到你在做什么有助于意识到别名隐藏的内容。走到另一台机器上,你有一个问题,因为你忘了你的别名到底有什么了!