如何跟踪未跟踪的内容?

ssc*_*rus 155 git git-submodules

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

我的本地目录中有一个未跟踪的文件夹.当我跑步时git status,我得到:

Changed but not updated:
modified:   vendor/plugins/open_flash_chart_2 (modified content, untracked content)
Run Code Online (Sandbox Code Playgroud)

当我输入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'
    
    Run Code Online (Sandbox Code Playgroud)
  • 试着 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
    
    Run Code Online (Sandbox Code Playgroud)
  • git status

    modified: vendor/plugins/open_flash_chart_2 (untracked content)
    
    Run Code Online (Sandbox Code Playgroud)
  • .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:
Run Code Online (Sandbox Code Playgroud)

我是Github的一个完整的新手,尽管我试图通过文档,但我对这些特殊问题感到有些困惑.谢谢.

Chr*_*sen 235

您已添加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
Run Code Online (Sandbox Code Playgroud)

最后一个命令是问题所在.该目录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
Run Code Online (Sandbox Code Playgroud)

如您所见,如果索引中已存在路径,则此方法无效.解决方案是暂时从索引中删除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
Run Code Online (Sandbox Code Playgroud)

这将使用您现有的子存储库(即它不会重新克隆源存储库)并暂存一个如下所示的.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
Run Code Online (Sandbox Code Playgroud)

它还会在主存储库中创建一个类似的条目.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
Run Code Online (Sandbox Code Playgroud)

这次添加目录时,它不是子存储库,因此文件将正常添加.不幸的是,由于我们删除了.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
Run Code Online (Sandbox Code Playgroud)

后来:

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
Run Code Online (Sandbox Code Playgroud)

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

  • 我们在聊天中讨论了这个问题(http://chat.stackoverflow.com/transcript/message/103753#103753).OP能够删除子存储库的`.git`目录并重新添加文件"flatly"(第一个"Plain Content"选项). (2认同)

neo*_*eye 112

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


小智 12

  1. 我从那些新目录中删除了.git目录(这可以创建子模块戏剧.如果感兴趣,谷歌吧.)
  2. 然后我运行了git rm -rf --cached/the/new /目录
  3. 然后我用git add重新添加目录.从上面

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


Pet*_*ada 6

要指出我必须从克里斯约翰森与OP的聊天中挖掘出来的东西(从答复回复链接):

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

git add vendor/plugins/open_flash_chart_2/ #注意SLASH !!!!

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


Elo*_*ici 5

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

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

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


小智 5

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

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