3

我在网上看了几天,但找不到我的问题的答案。也许我在这里有更多的运气。

这是我面临的问题,我有几个旧代码库,比如 30 年,多年来它通过复制和过去以及向每个代码库添加自定义代码而增长。作为记录,它们现在都没有以任何方式由任何类型的源代码控制管理。

现在我想用 GIT 来控制所有的来源。我想要实现的主要目标是从所有不同的代码源创建一个新的主存储库,并确保如果一部分进入新的主存储库,它可以从那里维护到一个地方。

以下是我的一些想法,如果我说错了,请纠正我。

  1. 创建一个我拥有的最佳代码库的新仓库,并为这个新仓库中的每个代码库创建一个分支。这样我最终可以将每个代码库的好的部分合并到 Master 中。因此,Master 会及时收集所有最好的部分,我可以将最好的代码拉回每个单独的代码库中。然后,每个新的错误修复都将在 Master 中修复并由所有其他人拉动。

  2. 创建一个新的主存储库并使用补丁从不同的代码库中收集所有部分。但是我怎样才能以适当的方式维护代码并在一个地方进行错误修复呢?我是否必须将其修补回每个单独的代码库?还是我要更换遥控器并将其拉回/推回?

  3. 创建一个新的主存储库并使用樱桃采摘从不同的代码库中收集所有片段。但是我怎样才能以适当的方式维护代码并在一个地方进行错误修复呢?我必须把cherry-pick它放回每个单独的代码库吗?还是我要更换遥控器并将其拉回/推回?

如果有人应该有任何信息、提示或任何内容,请分享,因为我相信会有更多的人面临这个问题。

谢谢。

4

3 回答 3

5

一项目一仓库

对于您的每个项目,它将是一个结帐和一个存储库。

您可以创建一个存储库和 30 个分支,但这样做并没有明显的好处,并且会使标准实践更难执行(例如git flow是一种常见的工作模型,仅仅拥有 30 个分支本身就很麻烦)。

如果您有 30 个项目使用 70% 的相似代码,您需要选择为每个项目使用一个存储库,或者为代码库的每个子项目使用一个存储库。

例如,如果所有 30 个项目都有一个相同的“真棒”文件夹 - 这本身就是一个项目,并作为子模块包含在内。这将允许更容易维护并且没有代码重复(也没有复制和粘贴)。

如果一开始设置得当,如果以后您决定/意识到您的存储库/子模块的结构与您的需要不匹配,则很容易更改。

旨在实现共同的历史

如果您有 30 个项目,其中 70% 的代码,您可以选择其中一个作为您的“基础”项目,因此在逻辑上具有:

baseproject
   |- project 1.1
   |- project 1.2
   |- project 1.3

如果您已经维护了一个文件夹,用于复制和粘贴作为基础项目的新项目;以上内容没有年代意义(基础项目并不意味着它是在 1.1 等之前创建的)。

初始化你的 git 仓库

为了便于说明,我们假设您有两个项目树:

base
    README.md

project1.1
    README.md
    src/file

初始化您的基础存储库

以下是一些示例内容,稍后将允许查看历史记录如何变化:

$ cd /base
$ echo "base readme" > README.md

初始化 git 存储库并提交基础项目中的所有文件:

$ git init
Initialized empty Git repository in /base/.git
$ git add README.md
$ git commit -m "Adding base readme"
[master (root-commit) e7ec2b5] Adding base readme
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 README.md

初始化子项目

以下是与基础项目的一些区别:

$ cd /project1.1
$ echo "project 1.1" > README.md
$ mkdir src
$ echo "project 1.1 src file" > src/file

然后初始化git仓库:

$ git init
Initialized empty Git repository in /project1.1/.git

暂时不要提交内容。

链接到基础项目

添加一个遥控器,以便每个项目都链接到基础项目。如果没有别的,这允许将应用于基础项目代码的更改轻松地拉入您的子项目:

$ git remote add base /base/.git
$ git fetch base
$ git reset base/master

此时,project 1.1有基础项目的 git 历史记录,但工作副本中没有任何文件被修改。

$ git status
# On branch master
# Changes not staged for commit:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#   modified:   README.md
#
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#   src/

将差异提交到已跟踪的文件(README.md文件):

$ git commit -am "modifications to base files"

然后提交当前未跟踪的文件(src文件夹):

$ git add *
$ git commit -am "project 1.1 specific files"

这意味着该项目有 3 次提交的历史记录:

$ git log --oneline
22a82d7 project 1.1 specific files
951f32a modifications to base files
e7ec2b5 adding base readme

通过这种方式,您可以在一个地方维护您的“基础”更改,并且可以选择将在一个项目中所做的更改撤回到您的基础项目。

于 2013-07-03T09:06:47.220 回答
1

将每个代码库放入一个单独的存储库中,然后再创建一个存储库作为您的“超级存储库”,它可以包含所有其他存储库。将所有单独的存储库作为子模块添加到超级存储库。这使他们可以保留单独的历史记录,同时为您提供一种在单个位置跟踪它们的方法。

在此处阅读有关子模块的更多信息。

于 2013-07-03T13:04:58.730 回答
1

通常的方法是为每个代码库创建一个存储库。将不相关的代码放入一个大存储库会削弱源代码控制的好处。

根据您的评论,我认为您应该查看的是 git 子模块。它为您提供了一个可以与其他存储库共享的存储库。此外,如果您对一个项目中的公共代码进行了更改,您可以将其推送到主存储库,如果其他存储库希望使用这些更改,则可以在主存储库中使用它。

于 2013-07-03T07:59:21.703 回答