【问题标题】:How to track untracked content?如何跟踪未跟踪的内容?
【发布时间】:2011-05-08 20:13:40
【问题描述】:

关于我的原始问题,请参见实线下方。

我的本​​地目录中有一个未跟踪的文件夹。当我运行git status 时,我得到:

Changed but not updated:
modified:   vendor/plugins/open_flash_chart_2 (modified content, untracked content)

当我输入git add vendor/plugins/open_flash_chart_2 然后再次尝试git status 时,它仍然显示未跟踪。这是怎么回事?


以下是我最近半小时的简单总结:

  • 发现我的 Github 存储库没有跟踪我的 vendor/plugins/open_flash_chart_2 插件。具体来说,没有内容,并且在文件夹图标上显示一个绿色箭头

  • 试过git submodule init

    No submodule mapping found in .gitmodules for path 'vendor/plugins/open_flash_chart_2'
    
  • 试过git submodule add git://github.com/korin/open_flash_chart_2_plugin.git vendor/plugins/open_flash_chart_2

    vendor/plugins/open_flash_chart_2 already exists in the index
    
  • git status

    modified: vendor/plugins/open_flash_chart_2 (untracked content)
    
  • 在我的存储库/本地目录中寻找任何名为 .gitmodules 的文件,但找不到。

我必须做些什么来让我的子模块工作以便 git 可以开始正确跟踪?


这可能是不相关的(我包括它以防它有帮助),但每次我输入 git commit -a 而不是我通常的 git commit -m "my comments" 时,它都会抛出一个错误:

E325: ATTENTION
Found a swap file by the name ".git\.COMMIT-EDITMSG.swp"
         dated: Thu Nov 11 19:45:05 2010
     file name: c:/san/project/.git/COMMIT_EDITMSG
      modified: YES
     user name: San   host name: San-PC
    process ID: 4268
While opening file ".git\COMMIT_EDITMSG"
         dated: Thu Nov 11 20:56:09 2010
  NEWER than swap file!  
Swap file ".git\.COMMIT_EDITMSG.swp" already exists!
[O]pen Read-Only, (E)dit anyway, (R)ecover, (D)elete it, (Q)uit, (A)bort:
Swap file ".git\.COMMIT_EDITMSG.swp" already exists!
[O]pen Read-Only, (E)dit anyway, (R)ecover, (D)elete it, (Q)uit, (A)bort:

我是 Github 的新手,尽管尝试浏览文档,但我还是被这些特殊问题难住了。谢谢。

【问题讨论】:

  • 我对一些事情感到困惑。一:为什么老是说github?你所说的一切听起来都是本地的(除了那个绿色箭头——我对此一无所知)。对吗,或者这是关于将更新推送到 github 的问题?二:你真的做过任何事情来创建这个插件作为子模块吗?子模块本身就是一个 git 存储库。您单独创建它,然后将其添加到超级项目中。
  • 嗯, git status 的输出表明那里确实有一个子模块......但是你真的没有.gitmodules文件吗?老实说,如果这个插件有自己的仓库,并且你知道你想要什么版本,你可以从你的项目中删除那个目录,确保 .gitmodules 中没有条目,然后通过子模块设置:git submodule addgit submodule update --init.
  • Jefromi - 实际上我没有两次提到 Github - 第一次是因为绿色箭头出现在 open_flash_chart_2 的实际 Github 存储库中黄色文件夹图像的顶部。我很乐意编辑答案以使其更清晰。
  • @sscirrus:你绝对应该有一个偏好,子模块与否。如果这是您不打算处理的外部事物,但您可能希望从中进行更新,那么它应该是一个子模块。如果您不关心从其原始存储库获取更新,并且可能想自己破解源代码,那么它不应该是子模块。
  • 这个问题似乎纯粹是关于 git 子模块的。我删除了一些标签,因为这个问题与 rails 或 github 没有直接关系,它适用于所有 git 用例。 tracking 标签似乎用于“网站访问者跟踪”主题,因此也不适用。

标签: git git-submodules


【解决方案1】:

您已将vendor/plugins/open_flash_chart_2 添加为“gitlink”条目,但从未将其定义为子模块。实际上,您正在使用 git submodule 使用的内部功能(gitlink 条目),但您没有使用子模块功能本身。

你可能做了这样的事情:

git clone git://github.com/korin/open_flash_chart_2_plugin.git vendor/plugins/open_flash_chart_2
git add vendor/plugins/open_flash_chart_2

最后一个命令是问题所在。目录vendor/plugins/open_flash_chart_2 最初是一个独立的 Git 存储库。通常这样的子存储库会被忽略,但是如果你告诉 git add 显式添加它,那么它将创建一个指向子存储库的 HEAD 提交的 gitlink 条目,而不是添加目录的内容.如果 git add 拒绝创建这样的“半子模块”可能会很好。

普通目录在 Git 中表示为树对象;树对象为它们包含的对象(通常是其他树和 blob 对象——分别为目录和文件)提供名称和权限。子模块表示为“gitlink”条目; gitlink 条目仅包含子模块的 HEAD 提交的对象名称(哈希)。 gitlink 提交的“源存储库”在.gitmodules 文件中指定(以及子模块初始化后的.git/config 文件)。

您拥有的是一个指向特定提交的条目,而没有记录该提交的源存储库。您可以通过将 gitlink 设置为适当的子模块来解决此问题,或者删除 gitlink 并将其替换为“正常”内容(普通文件和目录)。

把它变成一个合适的子模块

vendor/plugins/open_flash_chart_2 正确定义为子模块唯一缺少的是.gitmodules 文件。通常(如果您尚未将其添加为裸 gitlink 条目),您只需使用 git submodule add:

git submodule add git://github.com/korin/open_flash_chart_2_plugin.git vendor/plugins/open_flash_chart_2

如您所见,如果路径已存在于索引中,这将不起作用。解决方法是暂时从索引中移除gitlink条目,然后添加子模块:

git rm --cached vendor/plugins/open_flash_chart_2
git submodule add git://github.com/korin/open_flash_chart_2_plugin.git vendor/plugins/open_flash_chart_2

这将使用您现有的子存储库(即它不会重新克隆源存储库)并暂存一个如下所示的.gitmodules 文件:

[submodule "vendor/plugins/open_flash_chart_2"]
    path = vendor/plugins/open_flash_chart_2
    url = git://github.com/korin/open_flash_chart_2_plugin.git vendor/plugins/open_flash_chart_2

它还会在您的主存储库的 .git/config 中创建一个类似的条目(没有 path 设置)。

提交它,您将拥有一个适当的子模块。当您克隆存储库(或推送到 GitHub 并从那里克隆)时,您应该能够通过 git submodule update --init 重新初始化子模块。

用纯内容替换它

下一步假设您在vendor/plugins/open_flash_chart_2 中的子存储库没有您想要保留的任何本地历史记录(即您只关心子存储库的当前工作树,而不是历史记录)。

如果您关心的子存储库中有本地历史记录,则应先备份子存储库的 .git 目录,然后在下面的第二个命令中将其删除。(同时考虑git subtree 示例如下,它保留了子存储库 HEAD 的历史记录)。

git rm --cached vendor/plugins/open_flash_chart_2
rm -rf vendor/plugins/open_flash_chart_2/.git # BACK THIS UP FIRST unless you are sure you have no local changes in it
git add vendor/plugins/open_flash_chart_2

这次添加目录的时候,不是子库,所以会正常添加文件。不幸的是,由于我们删除了 .git 目录,因此没有超级简单的方法可以让源代码库保持最新。

您可以考虑改用subtree merge。这样做可以让您轻松地从源存储库中提取更改,同时保持存储库中的文件“平坦”(无子模块)。第三方git subtree command 是子树合并功能的一个很好的包装器。

git rm --cached vendor/plugins/open_flash_chart_2
git commit -m'converting to subtree; please stand by'
mv vendor/plugins/open_flash_chart_2 ../ofc2.local
git subtree add --prefix=vendor/plugins/open_flash_chart_2 ../ofc2.local HEAD
#rm -rf ../ofc2.local # if HEAD was the only tip with local history

稍后:

git remote add ofc2 git://github.com/korin/open_flash_chart_2_plugin.git
git subtree pull --prefix=vendor/plugins/open_flash_chart_2 ofc2 master

git subtree push --prefix=vendor/plugins/open_flash_chart_2 git@github.com:me/my_ofc2_fork.git changes_for_pull_request

git subtree 还有一个 --squash 选项,可以让您避免将源存储库的历史记录到您的历史记录中,但仍然可以让您拉入上游更改。

【讨论】:

  • 克里斯,我刚试过rm -rf vendor/plugins/open_flash_chart_2/.git,它说'rm'无法识别。然后我尝试了git rm -rf vendor/plugins/open_flash_chart_2/.git,它说fatal: pathspec 'vendor/plugins/open_flash_chart_2/.git' did not match any files(但我可以在Windows资源管理器中到达那里!)。
  • 我们讨论了这个问题in chat。OP 能够删除子存储库的.git 目录并“平淡地”重新添加文件(第一个“纯内容”选项) .
  • 这在前几天救了我这么多。我不小心在我的 git repo 中添加了一个带有 .git 目录的东西,然后 git kinda-sorta 认为它有一个子模块,这导致我的 git svn dcommits 吓坏了。如果可以的话,我会为你投票 3 次。
  • 要指出的是,第三方插件subtree不要和子树合并混淆。它不是一个包装器。作者是这么说的:P
  • @NebulaFox:虽然 git subtree只是子树合并的包装器,但它确实使用了与标准“子树合并”相同的技术” 过程(即git readtree --prefix=path 和子树合并:git merge with -s subtree or -Xsubtree=path)。它也有很好的附加功能:--squash 模式、split 命令以及pushpull 助手。
【解决方案2】:

我也遇到了同样的问题。原因是因为有一个包含“.git”文件夹的子文件夹。删除它让 git 很高兴。

【讨论】:

  • 是的,这发生在我的 AndroidStudio 中。当我尝试创建一个 git repo 文件夹时,已经在 /app 文件夹中创建了 git repo。谢谢。
  • 我在许多其他文件夹下有一个 Angular cli 创建的应用程序,并且一个文件夹有一个 .git 文件夹:/ 这是真正的问题而不是子模块的东西!
  • 这对我有用......我已经尝试了 git add 很多次,但什么也没发生。然后我删除 .git 文件夹
  • 但是如果我还想跟踪我的子文件夹怎么办?我该怎么办?
  • 有同样的情况。仍然想跟踪那个包含 .git 文件夹的子文件夹。删除此 sufolder .git 文件夹后,我的主 .git 文件夹中不再对其进行跟踪... .:(
【解决方案3】:
  1. 我从这些新目录中删除了 .git 目录(这可以创建子模块戏剧。如果有兴趣,请谷歌它。)
  2. 然后我运行 git rm -rf --cached /the/new/directories
  3. 然后我用 git add 重新添加了目录。从上面

参考网址https://danielmiessler.com/blog/git-modified-untracked/#gs.W0C7X6U

【讨论】:

    【解决方案4】:

    指出我必须从 Chris Johansen 与 OP 的聊天中挖掘出的内容(链接自对答案的回复):

    git add vendor/plugins/open_flash_chart_2 # 会添加 gitlink,内容不会被追踪

    git add vendor/plugins/open_flash_chart_2/ # 注意斜线!!!!

    第二种形式会在不使用gitlink的情况下添加,内容是可追踪的。 .git 目录被方便地自动忽略。谢谢克里斯!

    【讨论】:

      【解决方案5】:

      我一直使用彼得拉达建议的技巧,被称为“假子模块”:

      http://debuggable.com/posts/git-fake-submodules:4b563ee4-f3cc-4061-967e-0e48cbdd56cb

      它在几个场景中非常有用(我用它来将我所有的 Emacs 配置保存在一个存储库中,包括 elpa/el-get 包目录中所有 git 存储库的当前 HEAD,所以我可以轻松地回滚/转发当某些更新破坏某些东西时,将其转换为已知的工作版本。

      【讨论】:

        【解决方案6】:

        我通过从我的子文件夹中删除 .git 文件解决了这个问题。

        1. 首先从您的子文件夹中删除 .git 文件
        2. 然后通过运行以下代码从 git 中删除您的子文件夹,git rm -rf --cached your_subfolder_name
        3. 然后再次通过 git add . 命令添加您的文件夹

        【讨论】:

          【解决方案7】:

          http://progit.org/book/ch6-6.html

          我认为你应该阅读这篇文章来了解一些关于子模块的知识。写的很好,看完也不会花太多时间。

          【讨论】:

            【解决方案8】:

            我在一个包含许多子模块的大项目中遇到了同样的问题。 根据Chris JohnsenhereVonChere的回答,我构建了一个简短的bash脚本,它遍历所有现有的gitlink条目并将它们添加为适当的子模块。

            #!/bin/bash
            
            # Read all submodules in current git
            MODULES=`git ls-files --stage | grep 160000`
            
            # Iterate through every submodule path
            while read -r MOD; do
              # extract submodule path (split line at whitespace and take string with index 3)
              ARRIN=(${MOD})
              MODPATH=${ARRIN[3]}
            
              # grep module url from .git file in submodule path
              MODURL=`grep "url = " $MODPATH/.git/config`
              MODURL=${MODURL##*=}
            
              # echo path and url for information
              echo $MODPATH
              echo $MODURL
            
              # remove existing entry in submodule index
              git rm --cached $MODPATH
              # add new entry in submodule index
              git submodule add $MODURL $MODPATH
            done <<< "$MODULES"
            

            这对我来说已经解决了,希望对你有帮助。

            【讨论】:

              【解决方案9】:

              这对我来说效果很好:

              git update-index --skip-worktree

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

              再见!

              【讨论】:

                【解决方案10】:

                遇到了同样的问题,但在本次讨论中没有解决。

                我也遇到了线程打开中描述的子模块问题。

                % git status          
                # On branch master
                # Changes not staged for commit:
                #   modified:   bundle/taglist (untracked content)
                

                查看差异,我认出了附加到哈希的 -dirty: 再次阅读文档,为我解决了问题。 http://web.mit.edu/jhawk/mnt/spo/git/git-doc/user-manual.html 查看“子模块的陷阱”部分

                原因是,子模块中有更改或未跟踪的内容。 我首先必须进入子模块目录,执行“git add”+“git commit”来获取子模块中跟踪的所有内容。

                Then "git status" on the master stated
                % git commit
                # On branch master
                # Changes not staged for commit:
                #   modified:   bundle/taglist (new commits)
                

                现在这个来自子模块的新 HEAD 可以提交给主模块。

                【讨论】:

                  【解决方案11】:

                  我最近在从事合同项目(被视为机密)时遇到了这个问题。我必须在其中运行代码的系统没有互联网访问权限,当然出于安全目的,因此使用 composer 和 npm 安装依赖项变得非常痛苦。

                  在与我的同事深思熟虑后,我们决定只使用它并复制粘贴我们的依赖项,而不是执行 composer install 或 npm install。

                  这导致我们不在 gitignore 中添加供应商和 npm_modules。这是我遇到这个问题的时候。

                  Changed but not updated:
                  modified:   vendor/plugins/open_flash_chart_2 (modified content, untracked content)
                  

                  我用谷歌搜索了一下,发现这个有用的线程。在 Git 方面不太专业,并且在处理它时有点陶醉,我只是搜索了 vendor 文件夹中的所有子模块

                  find . -name ".git"
                  

                  这给了我一些 4-5 个依赖 git。我删除了所有这些 .git 文件夹,瞧,它起作用了。 我知道这是 hack,而且不是一个非常令人讨厌的。 SO之神,请原谅我!下次我保证阅读 gitlinks 并服从伟大的 Linus Tovalds。

                  【讨论】:

                    【解决方案12】:

                    这个问题已经回答了,但我想我会在收到这些消息时添加我发现的内容。

                    我有一个名为 playground 的存储库,其中包含许多沙盒应用程序。我通过克隆教程的存储库将教程中的两个新应用程序添加到 playground 目录。结果是新应用程序的 git 内容指向教程的存储库而不是我的存储库。解决方案是从这些应用程序的每个目录中删除.git 目录,mv 应用程序在playground 目录之外的目录,然后将mv 恢复并运行git add .。之后就成功了。

                    【讨论】:

                      【解决方案13】:

                      首先进入目录vendor/plugins/open_flash_chart_2DELETE


                      那么:

                      git rm --cached vendor/plugins/open_flash_chart_2  
                      git add .  
                      git commit -m "Message"  
                      git push -u origin master  
                      
                      git status  
                      

                      输出

                      在分支主
                      您的分支使用“origin/master”是最新的。
                      没什么可提交的,工作目录干净

                      【讨论】:

                        【解决方案14】:

                        在我的情况下,应该添加有问题的模块,但路径中没有前导斜杠 /

                        错误:

                        [submodule "/sources/meta-security"]
                                path = /sources/meta-security
                                url = git@gitlab.com:yocto/meta-security.git
                        

                        正确:

                        [submodule "sources/meta-security"]
                                path = sources/meta-security
                                url = git@gitlab.com:yocto/meta-security.git
                        

                        更改后,以下命令解决了问题:

                        git submodule update --init
                        

                        【讨论】:

                          猜你喜欢
                          • 2019-07-21
                          • 1970-01-01
                          • 1970-01-01
                          • 1970-01-01
                          • 1970-01-01
                          • 2014-05-02
                          • 1970-01-01
                          • 2010-11-26
                          • 2017-11-05
                          相关资源
                          最近更新 更多