对git子模块进行更改
我有一个第三方子模块的项目,我不是该项目的参与者 我必须对它的一些文件进行更改,即一些项目文件,以便我可以针对不同的平台(最初的项目针对mono,而我已经切换到dotnet core),但我仍然希望能够合并原始子模块存储库的最新更改 使用仅将项目作为子模块的正常设置,我无法成功克隆我的项目,因为git找不到我在原始存储库中所做的提交:对git子模块进行更改,git,Git,我有一个第三方子模块的项目,我不是该项目的参与者 我必须对它的一些文件进行更改,即一些项目文件,以便我可以针对不同的平台(最初的项目针对mono,而我已经切换到dotnet core),但我仍然希望能够合并原始子模块存储库的最新更改 使用仅将项目作为子模块的正常设置,我无法成功克隆我的项目,因为git找不到我在原始存储库中所做的提交: Server does not allow request for unadvertised object <my_commit_id> Fetche
Server does not allow request for unadvertised object <my_commit_id>
Fetched in submodule path <submodule>, but it did not contain <my_commit_id>
服务器不允许请求未经广告的对象
已在子模块路径中获取,但它不包含
我想做一些类似于命令gitsubmodule update--remote--rebase
的事情,在这个命令中,我对子模块所做的更改将写在原始remote的新更改之上,但我希望能够提交对超级项目所做的更改,以便在克隆存储库时,这些更改将应用于子模块的顶部
有什么方法可以做到这一点吗?子模块是一个存储库:您可以用替换它,它可以:
- 添加一个引用原始存储库的上游远程
- 完成上游提交(
)git-fetch-uptream
- 被重置为上游/主
- 使用您已完成的提交进行更新(
,在本地子模块更新-远程-重新基址
上重新基址分支的主节点
,已重置为原点/主节点
)上游/主节点
- 子模块是Git存储库。它只是一个Git存储库,其他Git超级项目将
Git克隆
,然后Git签出
一些特定的提交(作为子模块中的“分离头”)
任何克隆超级项目的人都会在某个时候运行git子模块更新--init
。这将使超级项目运行git clone
,以获取子模块git repository。您在克隆中所做的任何承诺都是。。。好吧,在你的克隆中。它们不在任何其他克隆中。因此,您必须让Internet上的每个人,或者至少是可能git clone
您的超级项目的每个人都可以访问您的子模块克隆
如果您不想让整个Internet访问您的笔记本电脑,而且您可能不想,那么您必须停止在笔记本电脑上保留子模块存储库的唯一副本。换句话说,您需要子模块的公共访问版本
假设您昨天克隆的子模块是https://github.com/someone/sub.git
。此子模块的笔记本电脑克隆,file://path/to/sub.git
,没有从Internet URL(file://...
在我的笔记本电脑上指的是我的文件,而不是你的)。因此,您需要做的是,在GitHub或任何地方,生成该子模块的分支:https://github.com/bodhi_daruma/sub.git
或任何可能的内容
现在您已经有了sub.git
的公共访问版本,您可以将子模块git提交发送到该存储库。您可能希望在笔记本电脑上的分支中提交子模块,而不是使用超级项目设置的“分离头”模式。请参阅有关如何执行此操作的现有问题。然后,您将git推送
您在笔记本电脑的子模块中所做的提交到GitHub上的git(或者您保存此文件的任何地方)
现在,您需要让超级项目Git参考https://github.com/bodhi_daruma/sub.git
,或者不管URL是什么,而不是https://github.com/someone/sub.git
。也就是说,当人们克隆您的超级项目时,该克隆会将他们的超级项目Git指向子模块的分支
唯一的另一个真正的替代方案是向维护您正在使用的子模块的人建议将您的提交合并到他们的(GitHub或其他)存储库中。这可能还涉及到在GitHub或Bitbucket上使用fork特性,或者在子模块存储库所在的任何位置使用fork特性