如何跟踪未跟踪的内容?

请看下面的实线为我原来的问题。

我的本地目录中有一个文件夹没有被跟踪。当我运行 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'
    
  • Tried 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)
    
  • Hunted for any file named .gitmodules in my repository/local directory but couldn't find one.

What do I have to do to get my submodules working so git can start tracking properly?


This may be unrelated (I include it in case it helps), but every time I type git commit -a rather than my usual git commit -m "my comments", it throws up an error:

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 是一个完全的新手,尽管尝试通过文档,我有点被这些特殊的问题难住了。谢谢你。

164038 次浏览

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

我认为您应该阅读这篇文章来了解一些关于子模块的知识。写得很好,而且不用花太多时间就能读完。

您已经将 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显式地添加它,那么它将创建一个指向子存储库的 HEAD 提交的 gitlink 条目,而不是添加目录的内容。如果 Git add拒绝创建这样的“半子模块”,那可能是件好事。

在 Git 中,普通目录表示为树对象; 树对象为它们包含的对象(通常是其他树和 blob 对象ーー分别是目录和文件)提供名称和权限。子模块表示为“ gitlink”条目; gitlink 条目只包含子模块的 HEAD 提交的对象名(hash)。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目录,因此没有超级简单的方法来使源代码存储库保持最新。

您可以考虑改用 子树合并。这样做可以让您轻松地从源存储库中获取更改,同时将文件保持在存储库中的“平面”(没有子模块)。第三方 < em > git 子树 命令是子树合并功能的一个很好的包装器。

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选项,可以避免将源代码存储库的历史记录合并到历史记录中,但仍然可以获取上游更改。

我也有同样的问题。原因是有一个子文件夹包含一个“。“ Git”文件夹。移除它让 Git 很开心。

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

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

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

看着这个差异,我认出了一个附加在散列表中的 a-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 可以提交到主模块。

为了指出我必须从 Chris Johansen 与 OP 的谈话中挖掘出的东西(链接到一个回答) :

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

注意这个斜线! ! ! !

第二个表单将添加它没有 gitlink,并且内容是可跟踪的。那个。Git 目录是方便和自动忽略。谢谢你,克里斯!

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

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

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

我在一个有很多子模块的大项目中遇到了同样的问题。 基于 Chris Johnsen 给你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"

这个帮我修好了,希望对我有所帮助。

我最近在一个合同项目(被认为是机密)工作时遇到了这个问题。我必须在其中运行代码的系统没有互联网接入,当然是出于安全目的,所以安装依赖关系,使用作曲器和 npm,正在变得非常痛苦。

经过与同事的深思熟虑,我们决定只是即兴发挥,复制粘贴我们的依赖关系,而不是进行作曲家安装或 npm 安装。

这导致我们没有在 gitignore 中添加供应商和 npm _ module。

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

我在谷歌上搜索了一下,在 SO 上找到了这个有用的帖子。在 Git 中,我不是很专业,在工作的时候有点陶醉,我只是搜索了供应商文件夹中的所有子模块

find . -name ".git"

这给了我一些4-5的依赖关系,已经得到了他们。我把这些都拿走了。Git 文件夹,瞧,成功了。 我知道这是黑客技术,而且也不是什么极客技术。众神啊,请原谅我!下次我保证会好好读读 Gitlink 然后服从伟大的莱纳斯 · 托瓦尔兹。

  1. 我从这些新目录中删除了. git 目录(这可以创建子模块 Drama。如果感兴趣,可以谷歌一下)
  2. 然后我运行 git rm-rf —— cached/the/new/目录
  3. 然后,我用上面的 gitadd.from 重新添加了目录

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

这个问题已经得到了回答,但是我想我应该把我收到这些信息时发现的东西加进去。

我有一个回购所谓的 playground,其中包含了一些沙盒应用程序。通过克隆教程的 repo,我在 playground目录中添加了两个新的应用程序。结果是,新应用的 git 内容指向的是教程的回购,而不是我的回购。解决方案是从每个应用程序的目录中删除 .git目录,在 playground目录之外删除 mv目录,然后返回 mv目录并运行 git add .。之后就成功了。

首先是 目录: 开源软件/插件/open _ flash _ chart _ 2删除


然后:

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


git status

输出

在树枝主人身上
你的分行已更新为「原产地/主机」。
没有犯罪工作目录

这对我来说效果很好:

Git update-index ——跳过工作树

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

再见!

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

  1. 首先从子文件夹中删除. git 文件
  2. 然后运行这段代码 Git rm-rf ——缓存了 your _ subfile _ name从 git 中删除子文件夹
  3. 然后再次通过 Git add.命令添加文件夹

在我的例子中,有问题的模块应该在路径中没有斜杠 /的情况下添加。

错:

[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

唯一对我有效的方法

  • 正在删除该子目录中的 .git文件夹
  • 然后将子目录从主目录中移出
  • git add .
  • git commit -m "cleaning up"
  • git push
  • 将子目录移回主目录
  • 又是 git add .
  • git commit -m "message"
  • git push

现在起作用了