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

Git策略需要在Git中获得一个旧的源代码,并对其进行管理,使其有一个单点来维护代码,git,version-control,Git,Version Control,我在网上浏览了好几天,但都找不到问题的答案。 也许我在这里运气更好 这就是我面临的问题,我有几个旧的代码库,比如说30个,这些年来,它通过复制和过去以及向每个代码库添加自定义代码而不断增长。记录在案的是,它们现在都不以任何方式由任何类型的源代码管理进行管理 现在我想使用GIT来控制所有的源代码。我想要实现的主要目标是从所有不同的代码源创建一个新的主存储库,并确保如果一个部件进入新的主repo,它可以从该主存储库维护到一个地方 以下是我的一些想法,如果我说错了,请纠正我 创建一个我拥有的最好的代码

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

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

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

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

  • 创建一个我拥有的最好的代码库的新repo,并在这个新repo中为每个代码库创建一个分支。这样,我最终可以将每个代码库的好部分合并到主代码中。因此,最终,主程序将收集所有最好的部分,我可以将最好的代码拉回到每个单独的代码库中。每一个新的错误修正都将在主程序中修复,并由所有其他程序执行

  • 创建一个新的主回购协议,并使用补丁收集来自不同代码库的所有片段。但是我怎样才能以正确的方式维护代码,并在一个地方进行bug修复呢? 我是否必须将其重新修补到每个单独的代码库中?或者我要更换遥控器并将其向后拉/推

  • 创建一个新的主回购协议,并使用cherry picking收集来自不同代码库的所有片段。但是我怎样才能以正确的方式维护代码,并在一个地方进行bug修复呢?我必须把它重新挑选回每个单独的代码库吗?或者我要更换遥控器并将其向后拉/推

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


    谢谢。

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

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

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

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

    如果您有30个项目使用70%的相似代码,那么您需要在为每个项目使用一个存储库或为代码库的每个子项目使用一个存储库之间进行选择

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

    如果在一开始就进行了适当的设置,那么在以后的某个日期,如果您决定/意识到存储库/子模块的结构与您需要的不匹配,则很容易进行更改

    目标是实现共同的历史 如果您有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 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
    
    此时,
    project1.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/
    
    然后提交当前未跟踪的文件(
    src
    文件夹):

    这意味着该项目有3次提交:

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

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

    将每个代码库放入一个单独的存储库,然后再创建一个存储库作为“超级回购”,该存储库可以包含所有其他代码库。将所有单个存储库作为子模块添加到super repo。这使它们可以保存单独的历史记录,同时让您能够在单个位置跟踪它们


    阅读更多信息。

    是的,每个代码库大约有70%是相似的,但每个代码库都有自己的自定义代码。不,主存储库将是将来生成新项目的单一点,而不是复制/过去,因此代码彼此相关,是一个应用程序。对于git来说尤其如此。对于其他一些风险投资公司,如svn或clearcase,通过部分签出和特定配置规范,拥有一个大型回购更易于管理。但是对于git来说,这不是一条路。Thx是的,这是我需要的更多东西。但是在查看子模块时,我也发现了树合并。那么有什么区别呢?我明白我必须使用更少的命令来实现