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


149

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

#在分支主管上
#尚未提交的更改:
#(使用“ git add ...”更新将提交的内容)
#(使用“ git checkout-...”放弃工作目录中的更改)
#(在子模块中提交或丢弃未跟踪或修改的内容)
#
#修改:包/片段(未跟踪的内容)
#修改:包/周围(未跟踪的内容)
#修改:bundle / trailing-spacespace(未跟踪的内容)
#修改:bundle / zencoding(未跟踪的内容)
#
没有添加任何更改来提交(使用“ git add”和/或“ git commit -a”)

添加--ignore-submodules参数将隐藏这些消息。但我想知道是否有办法以一种更合适,更核心的方式摆脱这种污垢。


3
这个答案:stackoverflow.com/a/5127213/199649引起了更多选择。
charlax 2012年

Answers:


95

由于git status报告未跟踪的内容,因此拥有干净状态的实际方法是进入这些子模块中的每个子模块,并且:

  • 添加并提交未跟踪的内容,
  • 或参考.gitignore每个模块特定的未跟踪内容。
  • 或者您可以将相同的被忽略内容添加到子模块的内容中.git/info/exclude,如peci1 在注释中报告。
  • 或在子模块规范中添加脏内容,如ezraspectre答案所述(建议)。

    git config -f .gitmodules submodule.<path>.ignore untracked
    
  • 或添加全局 .gitignore文件(通常为~/.gitignore-global)。例如,MariánČerný评论中报道的.DS_Store情况。参见手册页Carthage/Build.gitginore

用户希望Git在所有情况下都忽略的模式(例如,由用户选择的编辑器生成的备份或临时文件)通常进入core.excludesFile用户所指定的文件中~/.gitconfig。默认值为$XDG_CONFIG_HOME/git/ignore。如果$XDG_CONFIG_HOME未设置或为空,$HOME/.config/git/ignore则改为使用。


5
+1,我准备大喊大叫,直到发现这个问题……然后意识到一个.DS_Store文件已经被我的一个子模块自动创建(由OS X),阻止了我提交主项目。啊!更新时间.gitignore……
Courtney Christensen

使用Xcode,我还发现将* .xcuserdatad添加到.gitignore-global文件中很有用。这可以防止git尝试跟踪本地Xcode偏好设置。
罗伊·沙龙

如果您没有对子模块的推送权限,则无法与父存储库的其他用户共享对子模块的更改。在这种情况下,@ quincyglenn的解决方案似乎有效。
Drew Noakes

1
@VonC,根据情况和偏好,任何一个答案都有意义。我想在此强调区别,以供他人参考。顺便说一句,BTW非常感谢您就Git提出的许多答案-您已经帮助了我很多次。
Drew Noakes

2
您甚至可以不提交和创建.gitignore(它本身成为未跟踪的)而做。打开子模块,.git/info/exclude然后在其中添加忽略行(它的作用类似于.gitignore,但不属于共享存储库的一部分)。
Martin Pecka 2014年

144

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

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

我首选的解决方案,因为它易于自动化。
致命吉他

24
值得一提的是,它ignore = untracked也存在,并且显示了已修改的跟踪文件,但未显示未跟踪的文件。如果所有子模块都具有全局设置,
那就太好了

12

您也可以转到每个子模块目录并充当单独的git。例如:

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

毕竟


5
您可能不希望git add .不查看已修改的文件而这样做。在大多数情况下,所做的更改都是添加的.DS_Store文件- .gitignore正如zourtney在答案的第一个评论中提到的那样,这可能应该由您捕获。
gregoltsov 2012年

如果您实际上不想更新子模块并想要恢复到原始状态,则可能需要运行git submodule update --force
汤姆,

4

这可能是由于detached HEAD您的子模块分支中的。如果是这种情况,请进入您的子模块路径(例如:)./bundle/snipmate,然后运行git checkout master


2

昨天,在一个包含近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)
#   ...

要解决未跟踪内容错误,我不得不删除所有子模块未跟踪文件(均为*.pyc*.pyo使用由蟒蛇生成的文件).gitignore

为了解决另一个问题,我必须运行git submodule update哪个更新了每个子模块。


1

在我的情况下,我将模块克隆为ZF2环境中新模块的起点。这是将其自己的.git文件夹放入目录中。

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


1

当您在特定文件夹中还有另一个.git [隐藏文件夹]时,可能会发生这种情况。

已修改:./../ ..(修改后的内容,未跟踪的内容)

确保您的子目录不包含此.git文件夹。

如果是这种情况,可以通过从子目录中手动删除.git文件夹来解决此问题。


1

我更喜欢使用SourceTree,所以对我来说,解决方案是在SourceTree中打开子模块存储库,其中显示了所有未跟踪文件的列表。然后,我将所有组分组,然后使用“删除”。

之所以能够做到这一点,是因为我知道实际上并不需要所有未跟踪的文件。


1

这对我来说很好:

git update-index --skip-worktree <path>

如果不适用于pathname,请尝试使用文件名。让我知道这是否对您也有用。


-1

如果这是暂时性的问题,则可以进入子模块文件夹并运行,git reset HEAD --hard但是您将丢失子模块内部的所有更改。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.