W3b*_*Art 3 git version-control
我在网上看了好几天但找不到问题的答案.也许我在这里有更多的运气.
这是我面临的问题,我有几个旧的代码库,比如说30多年来,它通过复制和过去而增长,并为每个代码库添加自定义代码.对于记录,现在没有任何类型的源控件以任何方式管理它们.
现在我想用GIT来控制所有的来源.我想要实现的主要目标是从所有不同的代码源创建一个新的主存储库,并确保如果一个部件进入新的主存储库,它可以从其上维护到一个地方.
以下是我的一些想法,如果我说错了,请纠正我.
创建我拥有的最佳代码库的新repo,并为这个新repo中的每个代码库创建一个分支.这样我最终可以将每个代码库的好部分合并到Master中.所以,随着时间的推移,Master将收集所有最好的部分,我可以将最好的代码拉回到每个单独的代码库中.然后,每个新的错误修复都将在主服务器中修复,并由其他所有错误提取.
创建一个新的主仓库并使用修补程序收集不同代码库中的所有部分.但是,如何以正确的方式维护代码并在一个地方修复错误?我是否必须将其修补回每个单独的代码库?或者我是否更换遥控器并将其拉回?
创建一个新的主仓库并使用挑选来收集不同代码库中的碎片.但是,如何以正确的方式维护代码并在一个地方修复错误?我是否需要cherry-pick
重新使用每个单独的代码库?或者我是否更换遥控器并将其拉回?
如果有人应该有任何信息,提示或其他任何请分享,因为我相信会有更多的人面临这个问题.
谢谢.
对于您的每个项目,它将是一个结帐和存储库.
你可以创建一个存储库和30个分支,但这样做并没有明显的好处,它会使标准实践更难做(例如git flow是一个常见的工作模型,只有30个分支本身就很麻烦).
如果您有30个使用70%类似代码的项目,则需要选择为每个项目设置一个存储库,或者为代码库的每个子项目选择一个存储库.
例如,如果所有30个项目都有一个相同的"awesome"文件夹 - 这本身就是一个项目,并作为子模块包含在内.这样可以更容易维护,也不会重复代码(也不会复制和粘贴).
如果在开始时进行适当的设置,那么在以后您决定/意识到存储库/子模块的结构与您需要的结构不匹配时,很容易进行更改.
如果你有30个项目,70%的代码,你可以选择其中一个作为你的"基础"项目,因此逻辑上有:
baseproject
|- project 1.1
|- project 1.2
|- project 1.3
Run Code Online (Sandbox Code Playgroud)
如果你已经保持您使用复制和粘贴为新项目的文件夹即是你的基地项目; 上面没有任何按时间顺序的含义(基础项目并不意味着它是在1.1等之前创建的).
让我们假设为了说明你有两个项目树:
base
README.md
project1.1
README.md
src/file
Run Code Online (Sandbox Code Playgroud)
以下是一些示例内容,稍后将允许查看历史记录的变化:
$ cd /base
$ echo "base readme" > README.md
Run Code Online (Sandbox Code Playgroud)
初始化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
Run Code Online (Sandbox Code Playgroud)
以下是与基础项目的一些差异:
$ cd /project1.1
$ echo "project 1.1" > README.md
$ mkdir src
$ echo "project 1.1 src file" > src/file
Run Code Online (Sandbox Code Playgroud)
然后初始化git存储库:
$ git init
Initialized empty Git repository in /project1.1/.git
Run Code Online (Sandbox Code Playgroud)
不要提交内容.
添加一个遥控器,以便每个项目都链接到基础项目.这允许,如果没有别的,应用于基础项目代码的更改将被简单地拉入您的子项目:
$ git remote add base /base/.git
$ git fetch base
$ git reset base/master
Run Code Online (Sandbox Code Playgroud)
此时,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/
Run Code Online (Sandbox Code Playgroud)
为已经跟踪的文件(README.md
文件)提交差异:
$ git commit -am "modifications to base files"
Run Code Online (Sandbox Code Playgroud)
然后提交当前未跟踪的文件(src
文件夹):
$ git add *
$ git commit -am "project 1.1 specific files"
Run Code Online (Sandbox Code Playgroud)
这意味着该项目有3次提交的历史记录:
$ git log --oneline
22a82d7 project 1.1 specific files
951f32a modifications to base files
e7ec2b5 adding base readme
Run Code Online (Sandbox Code Playgroud)
通过这种方式,您可以在一个位置维护"基础"更改,并可选择将一个项目中所做的更改撤回到基础项目中.