如何管理一个项目的多个版本?

59

我有一个项目,使用 git 进行版本控制并开源。不久之后,我也将发布一个收费的托管版本,但是会对代码进行一些特定于收费版本的更改(例如性能等),这些更改不应存在于开源版本中。

我想避免使用两个不同的目录/项目,因为如果我在开源版本中修复了错误,则该错误很可能也存在于付费托管版本中。我不想在两个地方进行更改。

如何最好地管理此事?简单地在 git 中创建分支是不可行的,因为某些文件需要有 2 个版本:一个开源版本和一个付费托管版本。


3
为什么这个问题被认为是基于观点的而被关闭?在GIT方面,什么是观点? - Ayyash
2个回答

44

然而,分支应该是有效的,它将允许您维护两个独立的版本。

如果您有一个适用于高级版的错误,请在 master 上修复它,并在 premium 分支上合并。
Git 仅会合并自从您从 master 切出 premium 分支以来更改过的内容,即您的错误修复。
另一种在 masterpremium 中同时发布热修复的方法是从公共祖先开始:参见 "Git merging hotfix to multiple branches"。


更新 2015:git 2.5(2015 年 7 月)已经用新命令 git worktree add <path> [<branch>] 替换了下面介绍的 git-new-workdir 命令。

更多信息,请参见 "Multiple working directories with Git?"。


原始回答 2012:

me-and评论中提到了命令 git-new-workdir
请参见:

其中一种解决方法是简单地创建另一个本地克隆库。Git在本地克隆时自动使用硬链接,因此克隆非常快。
但这里有一个问题:现在你需要维护另外一个独立的库。

这就是git-new-workdir发挥作用的地方。
它不会完全克隆您的库,而是为您设置一个新的工作目录(带有自己的索引)。
实际上,仓库本身是原始和新工作目录之间共享的。这意味着:

  • 如果您在一个仓库中更新了提交,它们会立即在所有其他工作目录中显示。
  • 在一个工作目录中创建新提交或分支后,它们会立即在所有工作目录中都可见。

注意:即使提交已经自动存在,如果您选中了相同的分支,Git也不会更新工作副本。您需要自行更新。


1
你能给一个工作流程的例子吗?比如说我正在主分支(开源)上工作,然后需要对高级版进行更改。我只需要 git checkout premium 然后进行更改,再 git commit。然后再切换回主分支吗? - Justin
@Justin 是的,你可以这样做。或者你甚至可以将你的仓库克隆两次:一个在主分支,一个在高级分支。这样,你甚至可以并行开发。(而且你可以从一个本地仓库获取更改到另一个仓库)。 - VonC
你认为哪种方式更好,是克隆两个仓库并从每个仓库进行git pull,还是只有一个目录? - Justin
@Justin 这取决于你的开发目标:如果你想随时测试这两个版本中的任何一个,克隆是实用的。但如果你主要在其中一个版本上工作,并偶尔切换到另一个版本,则一个仓库就足够了。 - VonC
2
与其有多个克隆,我建议看一下 git-new-workdir - me_and
显示剩余2条评论

20

使用worktree是实现这个目的最好的方法。

在我的情况下,我有同一软件的两个版本,基础都相同但每个版本有不同的特性。

因此,我创建了两个worktree,也就是在主分支旁边创建了两个相关的长期运行的分支。

$git worktree add -b version-silver ..\version-silver master
$git worktree add -b version-gold ..\version-gold master

然后我有:

$git branch
master  # base stuff here
version-silver # some normal features
version-gold # some better features

有一个仓库,但我为每个分支旁边都有3个独立的文件夹。在主分支中进行常见更改,然后将其与其他两个版本合并。

cd master
vim basic.cpp
git add .
git commit -m "my common edit on basic.cpp"
cd ..\version-silver
vim silver.cpp
git add .
git commit -m "my specific edit on silver.cpp"
git merge master # here I get the basic.cpp latest changes for silver project
cd ..\version-gold
git merge master # here I get the basic.cpp latest changes for the gold project

每个版本的具体更改也将放在相应的文件夹中,每个项目的作品都是隔离的,并且IDE不会混淆。

希望这有所帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接