我们已经将子目录 S 放入单独的 repo 中,并将其作为子模块重新添加到分支 B 中。现在,当我想切换回原始分支 A 时,子目录已被 checkin 原始 repo, git 提示子模块中的内容未被跟踪,必须先移走。我们是否可以完全切换回 A 而无需手动将 S 拖走然后他们将其移回 B?
更新:下面的评论表明它可能是旧分支的缺陷,git 不愿意在这里做一件聪明的事情。是这样吗?如果有的话,对主仓库中带有 S 的原始分支进行什么样的 rebase 可以让它与子模块化版本共存并随时可以 check out ?
最佳答案
您的历史看起来像这样:
---X A
\
Y B
git ls-tree A显示(例如):
040000 tree 48770cdc854cc14fecc71029180be7a979f4baa1 S
100644 blob beac6e189b7c69b249271b52cd2db5e418c05a50 file
git ls-tree A:S显示(例如):
100644 blob 6357df9903460c9e8b43311aff3c7a6fd7fe6aa1 somefile
git ls-tree B显示(例如):
100644 blob 1f8556335163a2bcbcc366a17d08d1f8e0540e6f .gitmodules
160000 commit 234871cd6f0c1f9109e483383d7712dd8a1986e5 S
100644 blob beac6e189b7c69b249271b52cd2db5e418c05a50 file
(cd S; git ls-tree HEAD)显示(例如):
100644 blob abccc3958be33be4b93f56efae1b60820545aad2 somefile
您想从提交 Y(或更晚)移动到提交 X(或更早),反之亦然。
如果你的活跃分支是B,那么git checkout A说(例如):
error: The following untracked working tree files would be overwritten by checkout:
S/somefile
Please move or remove them before you can switch branches.
Aborting
Git 非常努力地不丢失数据,除非您告诉它这样做(例如使用“force”选项)。 Git 在这里发现并报告的问题是分支 A 对于 S/somefile 的内容不同。然后是工作树。因为S/somefile未被跟踪(从 super 项目的角度来看),Git 拒绝替换文件,因此拒绝切换分支/提交。
Git 可以说在这方面更聪明(通过注意到文件在子模块中被跟踪,因此在 super 项目中切换分支时不应真正将其视为未跟踪),但这是当前实现的限制。有一个针对 Git 的 Google Summer of Code 2011 项目 aims to address some areas of submodule support ,但我不清楚是否会涵盖这个确切的问题。
你可以按照你的建议重写你的历史,这样S总是似乎是一个子模块。这肯定会为 future 的提交切换提供最平滑的表面,但由于您需要确保在子模块的原始存储库中提交反射(reflect)了 S 的每个历史状态,所以这很复杂。原始提交中的目录。如果你有很多不同的 S树(即在将其转换为子模块之前,您在 S 下进行了一些本地更改),那么这可能是一个复杂的过程/脚本。
一个更简单的解决方法可能是在切换到将其作为目录的提交之前临时 checkout 子模块中的“空分支”。
在子模块中创建“空分支”。
git checkout --orphan empty
git rm -r --cached .
git commit --allow-empty -mempty
您可以在子模块的原始存储库中发布这个“分支”,这样其他人就不需要自己重新创建它了。
当您需要从 S 处的提交切换时是提交的子模块,其中 S是一个目录,先检查子模块中的“空分支”:
(cd S && git checkout empty)
git checkout A
你会看到这个警告,因为 Git 会留下 S/.git :
warning: unable to rmdir S: Directory not empty
因为 S/.git仍然存在,你应该小心只在 S 之外发出 Git 命令在处理具有 S 的提交时作为目录;在 S 下发出的 Git 命令将在 S/.git 上运行(在这种状态下,它只是一个“子存储库”,而不是一个完整的子模块)而不是顶层 .git存储库。
当您需要从 S 处的提交切换时是提交的目录,其中 S是子模块,切换父项目的commit后需要在子模块中 check out 相应的branch/commit。
您可以使用 git submodule update恢复记录在 super 项目中的提交。或者,如果您正在子模块中的一个分支上工作,只需将其重新 checkout 即可。
git checkout B
# THEN
git submodule update
# OR checkout a specific branch
(cd S && git checkout master)
# OR checkout previous branch
(cd S && git checkout -)
关于git - 在子目录位于主 repo 与子模块化的分支之间切换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6553743/
我构建了两个需要相互通信和发送文件的Rails应用程序。例如,一个Rails应用程序会发送请求以查看其他应用程序数据库中的表。然后另一个应用程序将呈现该表的json并将其发回。我还希望一个应用程序将存储在其公共(public)目录中的文本文件发送到另一个应用程序的公共(public)目录。我从来没有做过这样的事情,所以我什至不知道从哪里开始。任何帮助,将不胜感激。谢谢! 最佳答案 无论Rails是什么,几乎所有Web应用程序都有您的要求,大多数现代Web应用程序都需要相互通信。但是有一个小小的理解需要你坚持下去,网站不应直接访问彼此
我正在从erb文件切换到HAML。我将hamlgem添加到我的系统中。我创建了app/views/layouts/application.html.haml文件。我应该只删除application.html.erb文件吗?此外,仍然有/public/index.html文件被呈现为默认页面。我想创建自己的默认index.html.haml页面。我应该把它放在哪里以及如何使系统呈现该文件而不是默认索引文件?谢谢! 最佳答案 是的,您可以删除任何已转换为HAML的View的ERB版本。至于你的另一个问题,删除public/index/h
我正在使用active_admin,我在Rails3应用程序的应用程序中有一个目录管理,其中包含模型和页面的声明。时不时地我也有一个类,当那个类有一个常量时,就像这样:classFooBAR="bar"end然后,我在每个必须在我的Rails应用程序中重新加载一些代码的请求中收到此警告:/Users/pupeno/helloworld/app/admin/billing.rb:12:warning:alreadyinitializedconstantBAR知道发生了什么以及如何避免这些警告吗? 最佳答案 在纯Ruby中:classA
在Cooper的书BeginningRuby中,第166页有一个我无法重现的示例。classSongincludeComparableattr_accessor:lengthdef(other)@lengthother.lengthenddefinitialize(song_name,length)@song_name=song_name@length=lengthendenda=Song.new('Rockaroundtheclock',143)b=Song.new('BohemianRhapsody',544)c=Song.new('MinuteWaltz',60)a.betwee
我正在检查一个Rails项目。在ERubyHTML模板页面上,我看到了这样几行:我不明白为什么不这样写:在这种情况下,||=和ifnil?有什么区别? 最佳答案 在这种特殊情况下没有区别,但可能是出于习惯。每当我看到nil?被使用时,它几乎总是使用不当。在Ruby中,很少有东西在逻辑上是假的,只有文字false和nil是。这意味着像if(!x.nil?)这样的代码几乎总是更好地表示为if(x)除非期望x可能是文字false。我会将其切换为||=false,因为它具有相同的结果,但这在很大程度上取决于偏好。唯一的缺点是赋值会在每次运行
是否可以在应用程序中包含的gem代码中知道应用程序的Rails文件系统根目录?这是gem来源的示例:moduleMyGemdefself.included(base)putsRails.root#returnnilendendActionController::Base.send:include,MyGem谢谢,抱歉我的英语不好 最佳答案 我发现解决类似问题的解决方案是使用railtie初始化程序包含我的模块。所以,在你的/lib/mygem/railtie.rbmoduleMyGemclassRailtie使用此代码,您的模块将在
文章目录git常用命令(简介,详细参数往下看)Git提交代码步骤gitpullgitstatusgitaddgitcommitgitpushgit代码冲突合并问题方法一:放弃本地代码方法二:合并代码常用命令以及详细参数gitadd将文件添加到仓库:gitdiff比较文件异同gitlog查看历史记录gitreset代码回滚版本库相关操作远程仓库相关操作分支相关操作创建分支查看分支:gitbranch合并分支:gitmerge删除分支:gitbranch-ddev查看分支合并图:gitlog–graph–pretty=oneline–abbrev-commit撤消某次提交git用户名密码相关配置g
📢博客主页:https://blog.csdn.net/weixin_43197380📢欢迎点赞👍收藏⭐留言📝如有错误敬请指正!📢本文由Loewen丶原创,首发于CSDN,转载注明出处🙉📢现在的付出,都会是一种沉淀,只为让你成为更好的人✨文章预览:一.分辨率(Resolution)1、工业相机的分辨率是如何定义的?2、工业相机的分辨率是如何选择的?二.精度(Accuracy)1、像素精度(PixelAccuracy)2、定位精度和重复定位精度(RepeatPrecision)三.公差(Tolerance)四.课后作业(Post-ClassExercises)视觉行业的初学者,甚至是做了1~2年
在我让另一个人重做我的前端UI之前,我的Rails应用程序运行平稳。我已经尝试解决此错误3天了。这是错误:Nosuchfileordirectory-identifyExtractedsource(aroundline#59):575859606162@post=Post.find(params[:id])authorize@postif@post.update_attributes(post_params)flash[:notice]="Postwasupdated."redirect_to[@topic,@post]else{"utf8"=>"✓","_method"=>"patc
我正在尝试以一种更类似于普通RubyGem结构的方式构建我的Sinatra应用程序。我有以下文件树:.├──app.rb├──config.ru├──Gemfile├──Gemfile.lock├──helpers│ ├──dbconfig.rb│ ├──functions.rb│ └──init.rb├──hidden│ └──Rakefile├──lib│ ├──admin.rb│ ├──api.rb│ ├──indexer.rb│ ├──init.rb│ └──magnet.rb├──models│ ├──init.rb│ ├──invite.rb│ ├─