【问题标题】:How to get rid of Git submodules untracked status?如何摆脱 Git 子模块未跟踪状态?
【发布时间】: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 参数会隐藏这些消息;但我想知道是否有办法以更合适、更核心的方式去除这些污垢。

【问题讨论】:

标签: git git-submodules


【解决方案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
            • 或在子模块规范中添加脏内容,如 ezraspectreanswer 中所述(已投票)。

              git config -f .gitmodules submodule.<path>.ignore untracked
              
            • 或添加一个全局 .gitignore 文件(通常是~/.gitignore-global)。例如.DS_Store 或在我的情况下Carthage/BuildMariá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
                  猜你喜欢
                  • 2017-10-21
                  • 2012-02-29
                  • 1970-01-01
                  • 2017-07-23
                  • 1970-01-01
                  • 1970-01-01
                  • 2010-11-28
                  • 2013-09-24
                  相关资源
                  最近更新 更多