git 一个仓库管理多个项目

1. 仓库需求

  1. 一个仓库可以管理多个项目,仓库目录如下

rep-1
  | _ folder-a
    |_project-a
    |_project-b

  1. 各项目之间独立存在
  2. 为各项目打上标签
  3. 标签的压缩文件内不能包含其他项目文件,仓库公有文件除外
  4. 考虑使用 git workflow

2. 克隆父项目远程仓库

可以先创建一个远程空仓库

$ git clone git@xxxxxx/rep-1.git    # 克隆父项目远程仓库,到当前路径
$ cd rep-1  # 进入父项目目录,默认进入 master 分支

3. 创建项目公有文件

项目公有文件:各项目都包含的文件,标签的压缩文件内包含公有文件

可在rep-1或folder-a文件夹下创建project-a和project-a的公有文件。在创建项目分支前,创建公有文件,可减少跟踪文件的增删。若不需要项目公有文件可不创建。

# master 分支下,创建并切换到 develop 分支
$ git checkout -b develop   # 父分支为 master
$ cd folder-a
$ touch README.md   # 创建项目公有文件
$ git add README.md
$ git commit -m ''
$ git push origin develop:develop

4. 创建项目分支 – aa

在 develop 分支上创建无父分支的项目分支 aa。

# 当前,folder-a文件夹 develop 分支
$ git checkout --orphan [branch-name]   # 创建并切换无父分支的新分支
$ git ls-files    # 查看当前分支追踪的文件,是否有公有文件

# 删除暂存区当前分支不需要追踪的文件或文件夹
$ git rm --cached -r [folder-name]
$ git rm --cached [file-name]
$ git ls-files    # 再次查看,确认删除不需要追踪的文件

$ cd project-1  # 进入 project-1 的目录
$ git add .   # 添加当前文件夹中的内容到暂存区
$ git commit -m 'commit 说明文字'   # 将暂存区的内容提交到本地库
$ git push origin [branch-name]:[branch-name]   # 将本地库的内容推送到远程库
$ git tag -a [tag-name] -m '标签说明' [commit-id]   # 打标签
$ git push origin [tag-name]    # 将标签推送到远程库

5. 创建项目分支 – ab

  1. 重置 HEAD 到当前 (aa) 分支的第一个 commit
    $ git reset --soft [commit-id]  # --soft 不改变index和working copy中的文件
    
  2. 切换到 develop 分支
    $ git checkout [branch-name]    # 切换分支
    
  3. 查看跟踪文件
    $ git ls-files
    
  4. 添加或删除跟踪文件或文件夹,develop 分支只可跟踪公有文件
    $ git add [file]
    $ git rm [file]
    
  5. 重置HEAD
    $ git reset --keep HEAD
    # 保留工作目录与HEAD的文件差异, 将index将全部复原成HEAD
    # 即把在 HEAD 之后的提交清除掉,但保持工作区不变
    
  6. 在 develop 分支上创建无父分支的分支 ab

    同创建分支aa

6. 注意事项

  1. 创建好develop分支并提交公共文件后,在 develop 分支的同一个 commit 处创建项目分支;
  2. 分支切换:

    1. reset –soft 到当前分支的第一个 commit
    2. 切换到 develop 分支
    3. 切换到所需无父分支的分支
    4. 切换后的分支应处在当前分支的第一个 commit
    5. reset –soft 到当前分支最新的 commit

例如

当前 HEAD 在 aa 分支 a811d95 处,要切换到 ab 分支,切换流程如下:

$ git reset --soft 229bbcd  # 将分支 aa 的 HEAD 指向 229bbcd
$ git checkout ab   # 切换分支
$ git reset --soft 307d568  # 将 HEAD 指向当前分支的最新一次提交
$ git reset --keep HEAD # 重置 HEAD
Table of Contents