如何跟踪未跟踪的内容?

时间:2010-11-12 02:04:55

标签: git git-submodules

请参阅下面原始问题的实线。

我的本​​地目录中有一个未跟踪的文件夹。当我运行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 repo没有跟踪我的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的一个完整的新手,尽管试图通过文档,但我对这些特殊问题感到有些困惑。谢谢。

13 个答案:

答案 0 :(得分:234)

您已将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子树示例,它保留了子库的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选项,可以让您避免将源存储库的历史记录合并到历史记录中,但仍然允许您提取上游更改。

答案 1 :(得分:111)

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

答案 2 :(得分:9)

  1. 我从这些新目录中删除了.git目录(这可以创建子模块剧。如果感兴趣,可以使用Google。)
  2. 然后我运行了git rm -rf --cached / the / new / directories
  3. 然后我用git add重新添加目录。从上面
  4. 参考网址https://danielmiessler.com/blog/git-modified-untracked/#gs.W0C7X6U

答案 3 :(得分:6)

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

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

git add vendor/plugins/open_flash_chart_2/ #NOTTICE SLASH !!!!

第二个表单将添加它而不使用gitlink,并且内容是可跟踪的。 .git目录是方便的&自动忽略。谢谢克里斯!

答案 4 :(得分:5)

我一直使用Peter Lada建议的技巧,被称为“假子模块”:

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

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

答案 5 :(得分:3)

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

我认为您应该阅读本文以了解一些关于子模块的知识。它编写得很好,阅读它并不需要太多时间。

答案 6 :(得分:3)

我对一个包含许多子模块的大项目遇到了同样的问题。 根据{{​​3}} Chris Johnsenhere VonC的答案,我构建了一个简短的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"

这为我解决了,我希望它有任何帮助。

答案 7 :(得分:2)

我通过从子文件夹中删除.git文件来解决此问题。

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

答案 8 :(得分:1)

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

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

% 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)

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

答案 9 :(得分:1)

我最近在处理合同项目时遇到了这个问题(视为已分类)。出于安全目的,我必须运行代码的系统没有Internet访问权限,因此使用composer和npm安装依赖项变得非常痛苦。

在与我的同事经过深思熟虑后,我们决定将其复制并复制粘贴我们的依赖项,而不是进行composer install或npm install。

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

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

我用Google搜索了一下,在SO上发现了这个有用的帖子。在Git中没有太多的专业人员,并且在处理它时有点陶醉,我只搜索供应商文件夹中的所有子模块

find . -name ".git"

这给了我4-5个依赖关系,他们有git。我删除了所有这些.git文件夹,瞧,它有效。 我知道它是黑客,而不是一个非常令人讨厌的人。太神啊,请原谅我!下次我保证读取gitlinks并服从O强大的Linus Tovalds。

答案 10 :(得分:1)

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

我有一个名为playground的仓库,其中包含许多沙盒应用。我通过克隆教程的回购,将一个教程中的两个新应用程序添加到playground目录中。结果是新的应用程序&#39; git的东西指向教程的回购而不是我的回购。解决方案是从每个应用程序中删除.git目录。目录,mv应用程序&#39; playground目录之外的目录,然后mv返回并运行git add .。之后它起作用了。

答案 11 :(得分:1)

这对我来说很好:

git update-index --skip-worktree

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

再见!

答案 12 :(得分:0)

首先转到目录供应商/插件/ open_flash_chart_2 删除


时间:

    mtcars %>%
      rownames_to_column(var = "cars") %>%
      select(cars, hp) %>%
      mutate(hp = if_else(cars=="Merc 450SLC",
      sum(hp[which(.$cars == "Merc 450SL")], hp[which(.$cars == "Merc450SE")], hp[which(.$cars == "Merc 450SLC")]),
      hp))

输出

  

在分支母版上
  您的分支机构的最新信息是“ origin / master”。
  无需提交,工作目录干净