如何摆脱Git子模块未跟踪的状态?

我似乎无法摆脱Git子模块中未跟踪的内容。 运行git status产生:

 #在分支主机上
 #未进行提交的更改:
 #(使用“git add ...”更新将提交的内容)
 #(使用“git checkout  -  ...”放弃工作目录中的更改)
 #(提交或放弃子模块中未跟踪或修改的内容)
 #
 #修改:捆绑/ snipmate(未跟踪的内容)
 #修改:捆绑/环绕(未跟踪的内容)
 #修改:捆绑/尾随空白(未追踪的内容)
 #修改:捆绑/ zencoding(未跟踪的内容)
 #
没有更改添加到提交(使用“git add”和/或“git commit -a”)

添加--ignore-submodules参数隐藏这些消息; 但是我想知道是否有办法以更合适的核心方式去除这些污垢。

由于git状态报告未跟踪的内容,所以具有干净状态的实际方法是进入每个子模块,并且:

  • 添加并提交那些未追踪的内容,
  • 或引用特定于每个模块的.gitignore相同的未跟踪内容。
  • 或者可以将相同的忽略内容添加到子模块的.git/info/exclude ,如注释 中的 peci1报告。
  • 或者像ezraspectre的答案 (upvoted)中所提到的那样 ,在子模块规范中joindirty。

     git config -f .gitmodules submodule.<path>.ignore untracked 

我发现这个博客文章工作。 通过将.gitmodules文件中的每个条目添加ignore = dirty选项。

 [submodule "zen-coding-gedit3"] path = zen-coding-gedit3 url = git://github.com/leafac/zen-coding-gedit3.git ignore = dirty 

你也可以去每个子模块的目录,并作为一个分离的混帐。 例如:

 cd my/project/submodule git status 

… / 获取修改文件列表 /

 git add . //to add all of them to commit into submodule git commit -m "message to your submodule repo" 

您也可以使用更新远程子模块回购

 git submodule update 

毕竟

这将是由于子模块分支中的detached HEAD 。 进入你的子模块path(例如: ./bundle/snipmate ),然后git checkout master

我希望这个能帮上忙 :)

昨天我在这个问题上遇到了一个有12个子模块的项目。

git status显示输出。

 # On branch master # Changes not staged for commit: # (use "git add ..." to update what will be committed) # (use "git checkout -- ..." to discard changes in working directory) # (commit or discard the untracked or modified content in submodules) # # modified: proj1 (untracked content) # modified: proj1 (modified content, untracked content) # ... 

要解决未跟踪的内容错误,我必须使用.gitignore从所有子模块(全部是由python生成的*.pyc*.pyo文件)中移除未跟踪的文件。

为了解决其他问题,我不得不运行更新每个子模块的git submodule update

如果这是一个暂时的问题,你可以进入submodule文件夹并运行git reset HEAD --hard但是你会失去子模块内部的所有修改。

在我的情况下,我克隆模块作为我的ZF2环境中的一个新模块的起点。 这样做是把自己的.git文件夹放到目录中。

在这种情况下解决scheme是删除.git文件夹(您可能需要显示隐藏的文件来查看它)。