Git策略需要在Git中获取一个旧的源代码,并对其进行管理,使其拥有一个维护代码的点



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

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

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

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

  1. 创建一个我拥有的最好的代码库的新repo,并在这个新repo中为每个代码库创建一个分支。通过这种方式,我最终可以将每个代码库的好部分合并到Master中。因此,随着时间的推移,Master将收集所有最好的部分,我可以将最好的代码拉回到每个单独的代码库中。然后,每个新的错误修复都将在Master中修复,并由所有其他错误修复。

  2. 创建一个新的Master repo,并使用补丁从不同的代码库中收集所有片段。但是,我如何以正确的方式维护代码并在一个地方进行错误修复呢?我必须把它补回每个单独的代码库吗?或者我应该更换遥控器并将其向后拉/推?

  3. 创建一个新的Master repo,并使用樱桃采摘来收集来自不同代码库的所有片段。但是,我如何以正确的方式维护代码并在一个地方进行错误修复呢?我是否必须将其cherry-pick返回到每个单独的代码库中?或者我应该更换遥控器并将其向后拉/推?

如果有人有任何信息、提示或其他什么,请分享,因为我相信会有更多的人面临这个问题。

谢谢。

一个项目一个存储库

对于您的每个项目,它都将是一个签出和一个存储库。

您可以创建一个存储库和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

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

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

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

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

点击此处了解更多关于子模块的信息。

最新更新