如何摆脱 Git 子模块未跟踪状态?
Posted
技术标签:
【中文标题】如何摆脱 Git 子模块未跟踪状态?【英文标题】:How to get rid of Git submodules untracked status? 【发布时间】:2011-07-04 20:21:49 【问题描述】:我似乎无法摆脱 Git 子模块中未跟踪的内容。运行git status
产生:
添加--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 子模块未跟踪状态?的主要内容,如果未能解决你的问题,请参考以下文章