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

Posted

技术标签:

【中文标题】如何摆脱 Git 子模块未跟踪状态?【英文标题】:How to get rid of Git submodules untracked status? 【发布时间】:2011-07-04 20:21:49 【问题描述】:

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

# 在分支master上 # 未为提交暂存的更改: # (使用“git add ...”来更新将要提交的内容) # (使用 "git checkout -- ..." 丢弃工作目录中的更改) # (提交或丢弃子模块中未跟踪或修改的内容) # # 修改:bundle/snipmate(未跟踪的内容) # 修改:捆绑/环绕(未跟踪的内容) # 修改:捆绑/尾随空白(未跟踪的内容) # 修改:bundle/zencoding(未跟踪的内容) # 没有添加到提交的更改(使用“git add”和/或“git commit -a”)

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

【问题讨论】:

这个答案:***.com/a/5127213/199649 唤起了更多选择。 这能回答你的问题吗? Git: can I suppress listing of 'modified content'/dirty submodule entries in status, diff, etc? 【参考方案1】:

我发现这个blog post 可以正常工作。通过将ignore = dirty 选项添加到.gitmodules 文件中的每个条目。

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

【讨论】:

我的首选解决方案,因为它很容易实现自动化。 值得一提的是ignore = untracked 也存在,它显示修改后的跟踪文件,但不显示未跟踪文件。如果所有子模块都有一个全局设置,那就太好了...... 不出所料,在将近十年之后,博客文章链接已失效。 :)【参考方案2】:

根据我的经验,对于 MacOS,这可能是因为创建了 ._ 文件: 在这种情况下:试试dot_clean .

【讨论】:

【参考方案3】:

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

【讨论】:

【参考方案4】:

这对我来说效果很好:

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

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

【讨论】:

【参考方案5】:

我更喜欢使用SourceTree,所以我的解决方案是在 SourceTree 中打开子模块 repo,它会显示所有未跟踪文件的列表。然后我将它们全部分组,然后使用“删除”。

我能够这样做是因为我知道实际上并不需要所有未跟踪的文件。

【讨论】:

【参考方案6】:

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

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

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

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

【讨论】:

【参考方案7】:

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

添加并提交未跟踪的内容, 或在特定于每个模块的.gitignore 中引用未跟踪的内容。 或者您可以将相同的忽略内容添加到子模块的.git/info/exclude,如peci1 报告in the comments。

或在子模块规范中添加脏内容,如 ezraspectre 的 answer 中所述(已投票)。

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

或添加一个全局 .gitignore 文件(通常是~/.gitignore-global)。例如.DS_Store 或在我的情况下Carthage/Build 由Marián Černý 在the comments 中报告。见.gitginore man page:

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

【讨论】:

+1,我正准备尖叫,直到我发现这个......然后意识到.DS_Store文件已在我的一个子模块中自动创建(由OS X),阻止我提交主要项目。精氨酸!是时候更新.gitignore... 使用 Xcode,我还发现将 *.xcuserdatad 添加到 .gitignore-global 文件很有用。这可以防止 git 尝试跟踪本地 Xcode 首选项。 如果您没有子模块的推送权限,那么您不能与父仓库的其他用户共享您对子模块的更改。 @quincyglenn 的解决方案似乎适用于这种情况。 @VonC,根据情况和偏好,任何一个答案都是有意义的。我想在这里强调区别作为对其他人的参考。顺便说一句,感谢您在 SO 上对 Git 的许多回答——您帮助了我很多次。 你甚至可以不提交和创建一个 .gitignore (它本身变得未被跟踪)。打开子模块的 .git/info/exclude 并在其中添加忽略行(它的工作方式类似于 .gitignore,但不是共享存储库的一部分)。【参考方案8】:

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

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

【讨论】:

【参考方案9】:

我昨天在一个有近 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 从所有子模块中删除未跟踪的文件(都是*.pyc*.pyo 文件)。

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

【讨论】:

【参考方案10】:

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

【讨论】:

【参考方案11】:

您还可以转到每个子模块目录并充当单独的 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

毕竟

【讨论】:

您可能不想在不查看修改后的文件的情况下执行git add .。大多数情况下,所做的更改是添加的 .DS_Store 文件 - 正如 zourtney 在答案的第一条评论中提到的那样,这可能会被您的 .gitignore 捕获。 如果您真的不想更新子模块并想恢复到原始状态,您可能需要运行git submodule update --force

以上是关于如何摆脱 Git 子模块未跟踪状态?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Git 上添加未跟踪的文件?

Git在添加主存储库之前恢复主存储库后未删除子模块

手把手教你把 Git 子模块更新到主项目

Git 在哪里存储子模块提交的 SHA1?

如何更改 git 子模块的远程存储库?

如何从 aws lambda 中的 git 子模块导入代码?