我有一个项目,使用 git
进行版本控制并开源。不久之后,我也将发布一个收费的托管版本,但是会对代码进行一些特定于收费版本的更改(例如性能等),这些更改不应存在于开源版本中。
我想避免使用两个不同的目录/项目,因为如果我在开源版本中修复了错误,则该错误很可能也存在于付费托管版本中。我不想在两个地方进行更改。
如何最好地管理此事?简单地在 git
中创建分支是不可行的,因为某些文件需要有 2 个版本:一个开源版本和一个付费托管版本。
我有一个项目,使用 git
进行版本控制并开源。不久之后,我也将发布一个收费的托管版本,但是会对代码进行一些特定于收费版本的更改(例如性能等),这些更改不应存在于开源版本中。
我想避免使用两个不同的目录/项目,因为如果我在开源版本中修复了错误,则该错误很可能也存在于付费托管版本中。我不想在两个地方进行更改。
如何最好地管理此事?简单地在 git
中创建分支是不可行的,因为某些文件需要有 2 个版本:一个开源版本和一个付费托管版本。
然而,分支应该是有效的,它将允许您维护两个独立的版本。
如果您有一个适用于高级版的错误,请在 master
上修复它,并在 premium
分支上合并。
Git 仅会合并自从您从 master
切出 premium
分支以来更改过的内容,即您的错误修复。
另一种在 master
和 premium
中同时发布热修复的方法是从公共祖先开始:参见 "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也不会更新工作副本。您需要自行更新。
git checkout premium
然后进行更改,再 git commit。然后再切换回主分支吗? - Justingit pull
,还是只有一个目录? - Justin使用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不会混淆。
希望这有所帮助。