Git – 如何跟踪未跟踪的内容?

下面的实线我的原始问题。

我有一个文件夹在我的本地目录未跟踪。 当我运行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 ,它仍然说untracked。 这是怎么回事?


这里是我最近半小时的简单总结:

  • 发现我的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) 
  • 在我的仓库/本地目录中find任何名为.gitmodules文件,但找不到。

我需要做什么来让我的子模块工作,所以混帐可以开始正确跟踪?


这可能是无关的(我把它包括在案例中有帮助),但是每次我inputgit 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是一个完全的新手,尽pipe试图通过文档,我有点被这些特定的问题难住。 谢谢。

您已经将vendor/plugins/open_flash_chart_2添加为“gitlink”条目,但从未将其定义为子模块。 实际上,您正在使用git子模块使用的内部function(gitlink条目),但是您没有使用子模块function本身。

你可能做了这样的事情:

 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仓库开始。 通常这样的sub-repositories被忽略,但是如果你告诉git add显式地添加它,那么它将创build一个指向子仓库的HEAD提交的gitlink条目,而不是添加目录的内容。 如果git add会拒绝创build这样的“半子模块”,那可能会很好。

正常的目录在Git中被表示为树对象; 树对象给它们包含的对象(通常是其他树和blob对象 – 目录和文件)提供名称和权限。 子模块被表示为“gitlink”条目; gitlink条目只包含子模块HEAD提交的对象名(hash)。 gitlink提交的“源代码库”是在.gitmodules文件中指定的(一旦子模块被初始化, .gitmodules .git/config文件)。

你有什么是一个指向特定提交的条目,而不logging该提交的源存储库。 你可以通过把你的gitlink变成一个合适的子模块来解决这个问题,或者通过删除gitlink并用“普通”内容(纯文件和目录)来replace它。

把它变成一个适当的子模块

vendor/plugins/open_flash_chart_2正确定义为子模块的.gitmodules.gitmodules文件。 通常(如果你还没有添加它作为裸gitlink条目),你可以使用git submodule add

 git submodule add git://github.com/korin/open_flash_chart_2_plugin.git vendor/plugins/open_flash_chart_2 

如你所见,如果path已经存在于索引中,这将不起作用。 解决scheme是暂时从索引中删除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 

这将使用您现有的子存储库(即不会重新克隆源存储库),并创build一个.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设置)中做类似的input。

承诺,你将有一个适当的子模块。 当你克隆版本库(或者推送到GitHub并从那里克隆)时,你应该能够通过git submodule update --init重新初始化子git submodule update --init

将其replace为普通内容

下一步假定您的vendor/plugins/open_flash_chart_2中的子存储库没有任何要保留的本地历史logging(即,您所关心的只是子存储库的当前工作树,而不是历史logging)。

如果您在您所关心的子存储库中有本地历史logging,那么在下面的第二个命令中删除它之前,您应该备份子存储库的.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命令是子树合并function的一个不错的包装。

 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子树也有一个--squash选项,可以避免将源代码库的历史logging合并到历史logging中,但仍然可以引入上游变更。

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

指出克里斯·约翰森(Chris Johansen)与OP谈话的内容(从回复答案中链接出来):

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

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

第二种forms将添加它没有gitlink,并且内容是可跟踪的。 .git目录方便且自动地被忽略。 谢谢Chris!

我一直使用彼得·拉达(Peter Lada)提出的把戏,称为“假子模块”:

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

这在几个场景中是非常有用的(我使用它来保存所有的Emacsconfiguration在一个仓库中,包括elpa / el-get包目录中的所有git仓库的当前HEAD,所以我可以轻松地回滚/转发到一个已知的工作版本,当一些更新打破东西)。

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

我想你应该阅读这个来学习一些关于子模块。 它写得很好,阅读它并不需要太多时间。

  1. 我从这些新目录中删除.git目录(这可以创build子模块戏剧,如果感兴趣,可以使用Google模块)。
  2. 然后我运行git rm -rf –cached / the / new /目录
  3. 然后我重新添加一个git add的目录。 从上面

参考urlhttps://danielmiessler.com/blog/git-modified-untracked/#gs.W0C7X6U

我有一个与许多子模块的大项目相同的问题。 基于Chris Johnsen 在这里和VonC 在这里的答案,我构build了一个简短的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" 

这固定它,我希望它是任何帮助。

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

我还打开了线程中描述的子模块问题。

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

看着差异,我认识到一个哈希附加一个-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可以被提交给主模块。

我最近在处理一个合同项目(被视为分类)时遇到了这个问题。 我必须运行代码的系统没有互联网访问权限,当然为了安全目的,所以使用composer和npm来安装依赖关系变得非常痛苦。

经过与我的同事仔细审议,我们决定只是翼,它复制粘贴我们的依赖,而不是做composer php安装或npm安装。

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

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

我GOOGLE了一下,发现这个有用的线程上。 在Git中并没有太多的专业知识,在工作的时候有点陶醉,我只是在vendor文件夹中search所有子模块

 find . -name ".git" 

这给了我一些4-5的依赖关系,他们依靠。 我删除了所有这些.git文件夹,瞧,它的工作。 我知道这是黑客,而不是一个非常怪异的反正。 所有的神啊,请原谅我! 下一次,我答应阅读gitlinks并服从O强大的Linus Tovalds。

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

我有一个叫做playground的回购站,其中包含许多沙盒应用程序。 通过克隆教程的回购,我从教程添加了两个新的应用程序到playground目录。 结果是新的应用程序的git的东西指向教程的回购,而不是我的回购。 解决的办法是从每个应用程序的目录中删除.git目录,然后将操作目录之外的应用程序的目录删除,然后将它们mv回来并运行git add . 。 之后,它的工作。