请参阅下面原始问题的实线。
我的本地目录中有一个未跟踪的文件夹。当我运行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的一个完整的新手,尽管试图通过文档,但我对这些特殊问题感到有些困惑。谢谢。
答案 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)
参考网址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 Johnsen和here 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文件来解决此问题。
答案 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”。
无需提交,工作目录干净