【问题标题】:How to manage multiple versions of a project? [closed]如何管理一个项目的多个版本? [关闭]
【发布时间】:2012-08-22 14:46:13
【问题描述】:

我有一个使用git 进行版本控制的开源项目。很快,我也将发布该项目的高级托管版本,但是将专门针对高级托管版本(性能等)对代码进行更改,这在开源版本中不应该存在。

我想避免有两个单独的目录/项目,因为如果我修复了开源版本中的错误,那么该错误很可能也出现在高级托管版本中。我不想在两个地方进行更改。

管理此问题的最佳方法是什么?简单地在git 中分支是行不通的,因为有些文件需要有两个版本:一个开源版本和一个高级托管版本。

【问题讨论】:

  • 为什么这个问题是基于基于意见的?对 GIT 有何看法?

标签: git version-control project-management


【解决方案1】:

使用worktree 最适合此目的。

就我而言,我有两个版本的相同软件,基本相同,但每个版本都有一些不同的功能。

所以我创建了两个worktree,这意味着,在master 旁边创建两个相关的长期运行的分支。

$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 个彼此相邻的单独文件夹。并在master中进行通用更改。然后将其与其他两个版本合并。

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 gold project

每个版本的具体改动也会放在对应的文件夹中,每个项目的作品都是独立的,不会混淆IDE。

希望对您有所帮助。

【讨论】:

    【解决方案2】:

    然而,分支应该可以工作,并且允许您维护两个独立的版本。

    如果您有适用于高级版本的错误,请在 master 上修复它,并将其合并到 premium 分支上。
    Git 只会合并自从您在 masterpremium 之间分支以来发生的变化,即您的错误修复。
    masterpremium 中发布修补程序的另一种方法是从共同祖先开始:参见“Git merging hotfix to multiple branches”。


    2015 年更新:git 2.5(2015 年 7 月)已将下面的 git-new-workdir 替换为新命令 git worktree add <path> [<branch>]

    欲了解更多信息,请参阅“Multiple working directories with Git?”。


    2012 年原始答案:

    me-andthe comments 命令中提到git-new-workdir
    见:

    对此的一种解决方案是简单地创建存储库的另一个本地克隆。 Git 在本地克隆时会自动使用硬链接,因此克隆速度非常快。
    但是这样做有一个问题:您现在有另一个单独的存储库,您需要保持最新状态。

    这就是git-new-workdir 的用武之地。
    它无需对您的存储库进行全面克隆,而是简单地为您设置一个新的工作目录(带有自己的索引)。
    实际存储库本身在原始工作目录和新工作目录之间共享。这意味着:

    • 如果您更新一个存储库,新的提交也会立即在所有其他工作目录中可见。
    • 在您的一个工作目录中创建一个新的提交或分支,它们会立即在所有工作目录中可用。

    注意:即使提交是自动存在的,如果您已签出相同的分支,Git 也不会更新工作副本。你必须自己做。

    【讨论】:

    • 你能举一个工作流程的例子吗?例如说我正在研究master(开源),然后需要对高级版进行更改。我是否只需 git checkout premium 然后进行更改,然后 git commit。然后再次结帐大师?
    • @Justin 是的,你可以这样做。或者你甚至可以克隆你的 repo 两次:一次在 master 中,一次在高级中。这样,您甚至可以并行开发。 (并且您可以将更改从一个本地存储库获取到另一个存储库)。
    • 是的,你认为更好的方法是什么,克隆 repo 两次,然后分别执行 git pulls,还是有一个目录?
    • @Justin 这取决于您的开发目标:如果您希望能够随时测试这两个版本中的任何一个,克隆是实用的。但如果你主要在其中一个版本上工作,偶尔切换到另一个,一个 repo 就足够了。
    • 与其拥有多个克隆,我建议您查看git-new-workdir
    最近更新 更多