-1

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

编辑:看起来它是pin powerline:

$ 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 出了点问题?(我昨天克隆了这个 repo,然后恢复了这个更改。)

编辑3:我尝试git submodule直接使用(而不是我的别名)并且它有效!我可以通过git reset --hard在克隆之后重新创建问题(有时)。似乎这是我的别名的组合,它与 git 命令 git 忽略.git文件(或做一些我不理解的魔术)的工作方式不同。也许与我的 .git/config 引用了电力线有关。

编辑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

相对路径都是 using ../.git,这仅适用于第二个选项 - 当子模块位于 git 项目的根目录中时。

我已重命名此问题以更具体地解决我的问题,并重新询问了原始问题

4

2 回答 2

1

我认为答案是在使用不在顶级目录中的子模块时,git 中存在错误。

解决方案是删除存储在中的子模块的 git repo .git/modules

$ rm -fr multi/plugin/ .git/modules/multi/plugin/
$ git submodule add ../remote multi/plugin
Cloning into 'multi/plugin'...
done.
于 2012-08-01T17:33:07.383 回答
0

出于这个原因,我会远离 git 别名,并依靠 bash 历史记录来记住您之前输入的内容。您可以回忆一下复杂的单行代码CTRL-R和其他 bash 命令行优点。看到你在做什么有助于保持对别名隐藏的东西的意识。走到另一台机器上,您会遇到问题,因为您忘记了别名中的确切内容!

于 2012-08-01T03:26:22.900 回答