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
选项,可以让您避免将源存储库的历史记录合并到历史记录中,但仍然允许您引入上游更改.
小智 12
参考网址https://danielmiessler.com/blog/git-modified-untracked/#gs.W0C7X6U
要指出我必须从克里斯约翰森与OP的聊天中挖掘出来的东西(从答复回复链接):
git add vendor/plugins/open_flash_chart_2
#将添加gitlink,内容将保持不跟踪
git add vendor/plugins/open_flash_chart_2/
#注意SLASH !!!!
第二个表单将添加它而不使用gitlink,并且内容是可跟踪的..git目录可以方便地自动忽略.谢谢克里斯!
我一直使用Peter Lada建议的技巧,称为"假子模块":
http://debuggable.com/posts/git-fake-submodules:4b563ee4-f3cc-4061-967e-0e48cbdd56cb
它在几个场景中非常有用(我使用它来将我的所有Emacs配置保存在存储库中,包括elpa/el-get包目录中所有git存储库的当前HEAD,因此我可以轻松地回滚/转发到已知的一些更新破坏了某些东西的工作版本).
小智 5
我通过从子文件夹中删除 .git 文件解决了这个问题。
归档时间: |
|
查看次数: |
135910 次 |
最近记录: |