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
我想你应该阅读这个来学习一些关于子模块。 它写得很好,阅读它并不需要太多时间。
- 我从这些新目录中删除.git目录(这可以创build子模块戏剧,如果感兴趣,可以使用Google模块)。
- 然后我运行git rm -rf –cached / the / new /目录
- 然后我重新添加一个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 .
。 之后,它的工作。