如何追踪未追踪的内容?


159

有关我的原始问题,请参见以下实线。

我的本地目录中有一个未跟踪的文件夹。当我跑步时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 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的一名新手,尽管尝试阅读文档,但对于这些特殊问题我还是有些困惑。谢谢。


2
我对几件事感到困惑。一:为什么你一直说github?您正在谈论的所有内容听起来都是本地的(绿色箭头除外-我对此一无所知)。是这样吗,还是有关将更新推送到github的问题?第二:您实际上做了任何工作来将此插件创建为子模块吗?子模块本身就是一个git存储库。您可以单独创建它,然后将其添加到超级项目中。
卡斯卡贝尔

1
嗯,git status的输出表明那里确实有一个子模块...但是您真的没有.gitmodules文件吗?老实说,如果此插件具有自己的存储库,并且知道所需的版本,则可以从项目中删除该目录,确保.gitmodules中没有条目,然后进行子模块设置:git submodule addgit submodule update --init
卡斯卡贝尔

Jefromi-我实际上没有提到过两次以上Github-第一次是因为绿色箭头出现在open_flash_chart_2实际Github存储库中黄色文件夹图像的顶部。我会很乐意编辑答案以使其更清楚。
sscirrus

1
@sscirrus:您绝对应该有一个偏好设置,是否有子模块。如果这是外部事务,您将不打算进行处理,但是您可能希望对其进行更新,则它应该是一个子模块。如果您不关心从其原始存储库获取更新,并且可能想自己入侵源,则它不应是子模块。
卡斯卡贝尔

1
这个问题似乎纯粹是关于git子模块。我删除了一些标签,因为这个问题与rails或github没有直接关系,它将适用于所有git用例。而且该tracking标记似乎用于“网站访问者跟踪”主题,因此也不适用。
edgerunner

Answers:


239

您已添加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

最后一个命令就是问题。该目录vendor/plugins/open_flash_chart_2从一个独立的Git存储库开始。通常,此类子存储库会被忽略,但是如果您告诉git add显式添加它,那么它将创建一个gitlink条目,指向该子存储库的HEAD提交,而不是添加目录的内容。如果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目录,因此没有超级简便的方法可以使源存储库保持最新状态。

您可能会考虑使用子树合并。这样做可以让您轻松地从源存储库中获取更改,同时将文件“平放”在存储库中(没有子模块)。第三方git subtree命令是围绕子树合并功能的不错包装。

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资源管理器中到达那里!)。
sscirrus

2
我们在聊天中讨论了这个问题。OP能够删除子存储库的.gitdir,然后“扁平地”重新添加文件(第一个“纯内容”选项)。
克里斯·约翰森

1
前几天这为我节省了很多钱。我不小心在git repo中添加了带有.git目录的内容,然后git kinda-sorta认为它有一个子模块,这导致git svn dcommits异常。如果可以的话,我会投票给你3次。
davidtbernal 2011年

要指出的subtree是,不要将第三方插件与子树合并混淆。它不是包装器。作者是这样说的:P
NebulaFox 2011年

@NebulaFox:虽然git的子树只是围绕子树合并的包装,它的确使用相同的技术标准“子树合并”过程(即git readtree --prefix=path与子树合并:git merge-s subtree-Xsubtree=path)。它还在“顶部”有很多不错的功能:--squash模式,split命令以及pushpull帮助程序。
克里斯·约翰森

114

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


是的,这发生在AndroidStudio中。我试图在一个文件夹中创建一个git repo时,已经在/ app文件夹中创建了git repo。谢谢。
ZirconCode 2015年

我在许多其他文件夹下都有一个cli cli创建的应用程序,而一个文件夹下有一个.git文件夹:/这是真正的问题,而不是子模块的东西!
帕斯卡

这对我有用...我已经尝试了多次git add,但是什么也没发生。然后我删除.git文件夹
Ninja

1
但是,如果我仍然想跟踪子文件夹怎么办?我该怎么办 ?
cyber8200 '17

有相同的情况。仍然想跟踪该子文件夹,该子文件夹还包含一个.git文件夹。删除此sufolder .git文件夹后,在我的主.git文件夹中不再跟踪它...。:(
sqp_125 '18


6

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

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

git add vendor/plugins/open_flash_chart_2/ #通知SLASH !!!!

第二种形式将添加它而不使用gitlink,并且内容是可跟踪的。.git目录很方便且会自动被忽略。谢谢克里斯!


5

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

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

这在几种情况下非常有用(例如,我使用它将我的所有Emacs配置保留在存储库中,包括elpa / el-get软件包目录中所有git存储库的当前HEAD,因此我可以轻松地将其回滚/转发到已知的目录工作版本(如果某些更新破坏了某些内容)。



3

对于具有许多子模块的大型项目,我也遇到了同样的问题。基于对答案克里斯·约翰逊 在这里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"

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


2

这对我来说很好:

git update-index --skip-worktree

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

再见!


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提交到主模块。


1

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

经过与我的同事的深入讨论,我们决定只对它添加翼并复制粘贴我们的依赖项,而不是进行composer安装或npm安装。

这导致我们没有在gitignore中添加供应商和npm_modules。这是我遇到此问题的时间。

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

我在谷歌上搜索了一下,发现了关于SO的有用线程。并不是在Git中过分专业,并且在使用它时有些陶醉,我只是在vendor文件夹中搜索了所有子模块。

find . -name ".git"

这给了我4-5个具有git的依赖项。我删除了所有这些.git文件夹,瞧,它起作用了。我知道这是骇客,而不是一个非常怪异的人。哦,众神之神,请原谅我!下次我保证阅读gitlinks并服从O强大的Linus Tovalds。


1

这个问题已经回答了,但是我想我会在收到这些消息时发现的东西加进去。

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


0

首先进入目录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”。
无需提交,工作目录干净

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.