无法Git的子模块中的跟踪文件无法Git的子模块中的跟踪文件(Unable to track fil

2019-05-16 21:10发布

问题:在添加文件./shells/smallApps/*在到Git ./.git/时,我没有在文件./.git/info/exclude也没有任何.gitignore -files。

这个问题是基于该胎面哪里的问题没有完全解决。

我跑

$git status                                                                                                                                          ~/bin
# On branch master
nothing to commit (working directory clean)
$git ls-files                                                                                                                                        ~/bin
Screen/dev/vim-open.screen
--- cut ---

我注意到,我没有文件“壳/ smallApps / *”在我的Git

$ls shells/smallApps/                                                                                                                                ~/bin
devTodo     extract     
                                                                                                                                             ~/bin

我想通过运行将它们添加到我的Git

$git add shells/smallApps/devTodo shells/smallApps/extract
fatal: Path 'shells/smallApps/devTodo' is in submodule 'shells/smallApps'
$git add .         

我注意到,该文件不被添加到我的Git出于某种原因,使得

$git status                                                                                                                                          ~/bin 
# On branch master
nothing to commit (working directory clean)

我没有在文件git的/信息/排除也不被的.gitignore -files。

什么是最后的警告是什么意思?

Answer 1:

UPDATE

一般有两种原因,Git会忽略文件: gitignoresubmodules

具体而言,以下情况将导致混帐忽略一个文件时,“ git add ”被调用:

  1. 该文件相匹配的模式$GIT_DIR/exclude
  2. 该文件匹配的模式.gitignore回购内部文件。
  3. 该文件匹配用户特定的图案.gitignore文件(由“指定git config --global core.excludesfile ”)。
  4. 该文件是一个子模块的一部分。

强迫“ git add ”在一个被忽略的文件:

您可以检查,看是否有特定的文件是通过调用“忽略git add full/path/to/file ”。

该男子页指出,“如果在命令行上明确指定一个被忽略的文件,该命令将失败,并忽略的文件列表。”

如果文件被忽略,你可以强制与被添加“ git add --force full/path/to/file ”。

说明以消除子模块参考:

正如在前面的回答指出, shells/smallApps是一个子模块在你的仓库。

如果该文件是一个子模块的一部分,情况比较复杂。 你不能从主项目中修改子模块的内容。

如果你想消除子模块参考,并直接跟踪你的主仓库中的文件,有必须执行几个步骤。 你不能简单的从子模块中删除“git的”目录。 有你的主存储库和子模块之间的三个环节:

  1. .gitmodules文件在主回购。
  2. 在一个条目.git/config您的主仓库。
  3. 任何提交相关的子模块在主回购的历史。

每此相关的SO问题 ,您需要执行以下步骤来完全删除子模块:

注意:如果有其他分支依赖于该子模块,然后删除它可能会破坏你的仓库! 这是一个危险的操作...谨慎使用。

  1. 删除从相关行.gitmodules文件。
  2. 删除相关部分.git/config
  3. 运行git rm --cached path_to_submodule (没有斜线)。
  4. 承诺

这是该子模块的一部分的文件现在未被跟踪,你可以决定保留或根据需要(与下面提到的一个警告)删除它们。

如果您不需要这些文件,你可以简单地删除它们。

注意事项:如果你想保留这些文件(你似乎想),你必须手动删除.git从子模块文件夹目录:

  1. cd path_to_submodule
  2. rm .git
  3. cd ..
  4. git add path_to_submodule
  5. git status
  6. git commit

更新:

如果还需要资料:

为了帮助调试这个问题,请张贴下面的命令完成会议的成果:

cd to the top-level directory in your repo
ls -al
cat .git/config
find . -name ".git*"
git status
git add editors
git add shells
git status

基于对你迄今所做的一切说明,我希望看到:

  • 没有.gitmodules文件的任何地方
  • 只有一个.git目录(在你的回购的根目录)
  • 没有.git目录editors/vim/vimdoclet
  • 没有.git目录shells/smallApps


Answer 2:

我看你们还git add说一些关于子模块。 你有嵌套的Git仓库? 做这个:

$ find . -name .git

有多少.git目录中列出? 如果有不止一个,那么你已经有了多个嵌套库和可能是一些这种混乱的原因。



Answer 3:

您应该考虑张贴这个问题Git的邮件列表( git@vger.kernel.org )。 你可能会得到更及时和完整的响应。

如果你决定张贴在那里,一定要包括:

  • 你正在努力实现的内容的描述。
  • 问题的描述你曾经遇到过。
  • 一个完整的会话日志显示:
    • CD在你的回购的顶级目录
    • ls -al
    • cat .git/config
    • find . -name ".git*"
    • git status
    • git add editors
    • git add shells
    • git status


文章来源: Unable to track files within Git submodules