50

问题:当我在任何文件中都没有文件时,将文件添加./shells/smallApps/*到 Git 。./.git/./.git/info/exclude.gitignore

这个问题是基于这个问题没有完全解决的。

我跑

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

我注意到我的 Git 中没有文件“shells/smallApps/*”

$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/info/exclude 和 .gitignore -files 中都没有文件。

最后的警告是什么意思?

4

3 回答 3

102

更新

Git 忽略文件的一般原因有两个:gitignoresubmodules.

更具体地说,以下情况将导致 Git 在git add调用 ' ' 时忽略文件:

  1. 该文件匹配一个模式$GIT_DIR/exclude
  2. 该文件与.gitignorerepo 内的文件中的模式匹配。
  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 question,您需要执行以下步骤来完全删除子模块:

注意:如果另一个分支依赖于这个子模块,那么删除它可能会损坏您的存储库!这是一个危险的操作...谨慎使用。

  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
于 2009-07-08T14:58:23.700 回答
2

我看到您git add对子模块有所了解。你有嵌套的 Git 存储库吗?做这个:

$ find . -name .git

.git列出了多少个目录?如果有多个,那么您有多个嵌套存储库,这可能是造成这种混乱的原因。

于 2009-07-05T22:50:27.803 回答
2

您应该考虑将此问题发布到 Git 邮件列表 ( git@vger.kernel.org)。您可能会得到更及时和更完整的回复。

如果您决定在那里发帖,请务必包括:

  • 对您要达到的目标的描述。
  • 您遇到的问题的描述。
  • 完整的会话日志显示:
    • cd 到你的仓库中的顶级目录
    • ls -al
    • cat .git/config
    • find . -name ".git*"
    • git status
    • git add editors
    • git add shells
    • git status
于 2009-07-09T17:33:52.593 回答