首先,我是Mercurial和分布式源控制系统的新手。通常我使用了perforce,所以我将使用perforce术语来保持我想说的清楚。
我的问题是我正在制作一个基于开源引擎的游戏,并且该引擎会定期丢弃代码。但是,我自己也在自己的软件仓库中对引擎代码进行了一些更改。我需要进行设置,以便我可以轻松地将代码中的更改合并到我自己的代码中,而不会丢失我的更改,也无需手动检查每个文件。
在Perforce中,我要做的是只有引擎代码的分支,然后我的主分支,所有引擎代码丢弃都将提交给引擎代码分支,然后我将集成引擎代码分支进入主代码分支。解决问题,提交,瞧。
我觉得这与它在Mercurial中的工作方式非常接近,只是我缺少一些小的理解来帮助我解决这个问题。首先,我不确定我的引擎代码是应该在分支中,还是在完全独立的存储库中。即使我知道这一点,我也不清楚我是如何来回移动代码并保持它们分开的。
对不起,如果这是一个厨房水槽问题。我倾向于通过将自己折腾到最后来学习。
答案 0 :(得分:4)
首先,我将引擎和游戏分成两个存储库。如果您想在其他地方使用修改后的引擎,如果您想要回馈原始项目,如果您想将某人放在引擎上而不是游戏中,那么它会有所帮助......并将它们重新组合在一起,只需使用subrepo
功能。
现在在游戏引擎修改领域,只要没有冲突的变更,您只需要pull
,merge
然后commit
让我们假设一个场景:
1----2----4----5---------8----A----B <---- your changes
\ / / /
---3-------6----7----9----/ <---- original changes
有一天你开始使用引擎(1)。引擎已更新(2)但您可以使用它,就可以使用它。实际上不,你必须改变一些东西(4),同时,改变是在原来的(3)。没问题,只需获取它们(5)pull->merge->commit
。哦,他们做了改变(6)和另一个(7)。好吧,让我们包括它们(8)pull->merge->commit
。依此类推,他们进行了更改(9),您进行了更改(A)并将它们合并(B)。
从集中式版本控制切换到分布式版本控制时要记住的一个不自然的事情是,分支和合并是一个正常(和轻量级)的过程,而不是一个特殊的过程。有些人每天合并数百个时间。
为了更多的理解,尝试搜索“mercurial workflow”(这里我暴露了一个最小的工作流程)并阅读了Bryan O'Sullivan的优秀书籍Mercurial: The Definitive Guide
考虑像这样的最小项目:
mygame/
├── .hg/
├── .hgsub
├── lib/
│ └── engine/
│ ├── enginefile.cpp
│ └── .hg/
├── mygame.proj
└── src/
└── mygamefile.cpp
现在你的评论:
另外,我希望能够工作 在我所有的游戏内容相同 库[...]
如果我理解得很好,事实上,你想“能够在同一个[项目]中处理所有[你]游戏的内容”。如果我猜错了,请纠正我。
此处,包含.hg
子目录的两个目录是单独的存储库(mygame
和engine
)。但是您可以嵌套它们,而无需在IDE中创建单独的项目。所以有两个嵌套的存储库,但只有一个项目。在您的构建配置(Makefile
,解决方案......)中,您甚至可以从mygame
到engine
进行引用,因为engine
子存储库始终存在(通常在游戏中使用引擎的标题。)
[...]是否有可能得到它 稍微具体一点?例 命令,存储库,路径等?
engine
目录(cd lib/engine
)中:hg pull
,hg merge
,hg commit -m "merge new original with my modifications"
,cd ..
,{{ 1}},现在你有了包含更改的新版本。答案 1 :(得分:2)
听起来你可以在一个存储库中使用命名的mercurial分支执行与perforce几乎完全相同的事情:
hg branch engine-code
hg ci -m "created engine code branch"
# add the engine code drop
hg ci -m "new drop"
hg update default
hg merge engine-code # merges engine-code drop into your default branch
# test the result of the merge, then commit it:
hg commit -m "merged new engine drop"
这是初始设置。之后,当你想添加一个新的drop时,它是类似的:
hg update engine-code
# add the new drop
hg ci -m "nother new drop"
hg update default
hg merge engine-code
hg ci -m "merged another new engine drop"
答案 2 :(得分:2)
您想要的是一个“供应商分支” - 一个分支,您可以从上游供应商那里保留干净的代码。然后,您可以在另一个分支中进行自己的修改,并定期合并到已放入供应商分支的代码中。非常像你自己在问题中描述了krupan在他的回答中如何描述它。
我写了一组slides that explain how vendor branches work Mercurial。您应该能够使用Perforce背景跟随它们。搜索Mercurial邮件列表中的“供应商分支”也是shows many good hits。