一项目一仓库
对于您的每个项目,它将是一个结帐和一个存储库。
您可以创建一个存储库和 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
通过这种方式,您可以在一个地方维护您的“基础”更改,并且可以选择将在一个项目中所做的更改撤回到您的基础项目。