代码之家  ›  专栏  ›  技术社区  ›  sscirrus

如何跟踪未跟踪的内容?

  •  150
  • sscirrus  · 技术社区  · 14 年前

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

    我在本地目录中有一个未跟踪的文件夹。当我跑步时 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状态 再说一次,它仍然说没有追踪。发生什么事?


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

    • 发现我的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状态

      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的一个新手,尽管我试图浏览文档,但我还是有点被这些特定的问题所困扰。谢谢您。

    12 回复  |  直到 14 年前
        1
  •  233
  •   Chris Johnsen    14 年前

    您已添加 vendor/plugins/open_flash_chart_2 作为gitlink条目,但从未将其定义为子模块。实际上,您使用的是 Git子模块 使用(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
    

    最后一个命令是问题所在。目录 供应商/插件/开放式闪存图表 从一个独立的Git存储库开始。通常这样的子存储库会被忽略,但是如果您告诉 Git添加 要显式添加它,那么它将创建一个指向子库头提交的gitlink条目,而不是添加目录的内容。如果 Git添加 将拒绝创建这样的__半子模块__。

    普通目录在git中表示为树对象;树对象为其包含的对象(通常分别是其他树和blob对象目录和文件)提供名称和权限。子模块表示为gitlink条目;gitlink条目只包含子模块头提交的对象名(哈希)。Gitlinks提交的源存储库在 .gitmodules 文件(和 .git/config 初始化子模块后的文件)。

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

    把它变成一个子模

    唯一缺少的正确定义 供应商/插件/开放式闪存图表 因为子模块是 .git模块 文件。通常(如果您还没有将其添加为空的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
    

    这将使用现有的子存储库(即不会重新克隆源存储库)和阶段A .git模块 文件如下:

    [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/配置 (没有 path 设置)。

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

    将其替换为纯内容

    下一步假设您的子存储库位于 供应商/插件/开放式闪存图表 没有任何要保留的本地历史记录(即,您所关心的只是子存储库的当前工作树,而不是历史记录)。

    如果在您关心的子存储库中有本地历史记录,那么您应该备份子存储库。 .git 目录,然后在下面的第二个命令中删除它。 (同时考虑 Git子树 下面的例子保存了子仓库头的历史)。

    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子树 也有一个 --squash 该选项允许您避免将源存储库的历史记录合并到历史记录中,但仍然允许您引入上游更改。

        2
  •  111
  •   neoneye    14 年前

    我也有同样的问题。原因是有一个子文件夹包含一个“.git”文件夹。移除它让Git高兴。

        3
  •  9
  •   user2041369    7 年前
    1. 我从这些新目录中删除了.git目录(这可以创建子模块戏剧)。如果有兴趣,可以用谷歌搜索。)
    2. 然后我运行git rm-rf--cached/the/new/directories
    3. 然后我用git-add重新添加了目录。从上面

    引用URL https://danielmiessler.com/blog/git-modified-untracked/#gs.W0C7X6U

        4
  •  6
  •   Peter Lada    12 年前

    为了指出我必须从ChrisJohansen与OP的对话中挖掘出什么(链接到一个答案的回复):

    git add vendor/plugins/open_flash_chart_2 #将添加gitlink,内容将保持未跟踪状态

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

    第二个表单将不添加gitlink,并且内容是可跟踪的。.git目录很容易被自动忽略。谢谢你,克里斯!

        5
  •  5
  •   Eloici    11 年前

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

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

    它在一些场景中非常有用(例如,我使用它将所有Emacs配置保存在一个存储库中,包括el p a/el get package目录中所有Git存储库的当前负责人,这样当某些更新中断时,我可以很容易地回滚/转发到已知的工作版本)。

        6
  •  3
  •   rmk    14 年前

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

    我认为你应该读这个来学习一些子模块。它写得很好,读起来不需要太多时间。

        7
  •  3
  •   Community CDub    8 年前

    对于一个包含许多子模块的大项目,我也有同样的问题。 基于以下答案 Chris Johnsen here VonC here 我构建了一个简短的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"
    

    这是为我修的,希望能有所帮助。

        8
  •  1
  •   nero    13 年前

    有同样的问题,但在这次讨论中没有解决。

    我还碰到了在线程打开中描述的子模块问题。

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

    查看diff时,我发现哈希后面有一个-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)
    

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

        9
  •  1
  •   SLearner    9 年前

    我最近在一个合同项目中遇到了这个问题(被认为是机密的)。当然,为了安全起见,我必须运行代码的系统没有互联网接入,因此使用composer和npm安装依赖项变得非常痛苦。

    经过与同事的深思熟虑,我们决定只进行Wing和复制粘贴依赖项,而不进行Composer安装或NPM安装。

    这导致我们无法在gitignore中添加供应商和NPM_模块。这就是我遇到这个问题的时候。

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

    我在谷歌上搜索了一下,发现了这个有用的线索。我不是一个太多的Git专家,工作时有点陶醉,我只是在Vendors文件夹中搜索所有子模块。

    find . -name ".git"
    

    这给了我一些4-5的依赖性,他们有git。我删除了所有这些.git文件夹,瞧,它起作用了。 我知道这是黑客行为,无论如何也不是很古怪。噢,上帝啊,请原谅我!下一次,我保证会在Gitlinks上读到更多,并且服从强大的Linus Tovalds。

        10
  •  1
  •   Dana Scheider    7 年前

    这个问题已经被回答过了,但我想我会把收到这些信息后发现的信息加在一起。

    我有个回购协议 playground 其中包含许多沙盒应用程序。我在教程中添加了两个新的应用程序 操场 目录通过克隆教程的repo。结果是新应用程序的git内容指向了教程的repo,而不是我的repo。解决方案是删除 .git 每个应用程序目录中的目录, mv 应用程序目录位于 操场 目录,然后 中频 他们跑回去了 git add . . 在那之后它起作用了。

        11
  •  1
  •   DarkCrazy    6 年前

    这对我来说很好:

    Git更新索引--跳过工作树

    如果路径名不起作用,请尝试使用文件名。如果这对你也有用,请告诉我。

    再见!

        12
  •  0
  •   Program-Me-Rev    7 年前

    首先去 号码簿 : 供应商/插件/开放式闪存图表 删除


    然后:

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

    产量

    在分支主机上
    您的分支机构是最新的“原始/主”分支机构。
    没有要提交的内容,工作目录已清除