为现有Git项目中的子目录建立新项目

目录

如果某个项目中的某个组件同时被其他项目使用,可以为该子目录建立一个新的项目,提供给更多的项目使用。直接拷贝代码最方便,但通过Git可以生成保留版本信息的项目。

项目说明

perillaroc/nwpc-monitor-platform 项目为例说明。
将版本切换到 7f12e9e74745df3a42f7008d9110187a0e2d26da ,该版本是加入子项目之前的最后一个版本。

$ git reset --hard 7f12e9e74745df3a42f7008d9110187a0e2d26da
HEAD is now at 7f12e9e Change endpoint in url_for. And change url in config file.

需要单独建立项目的子目录为 nwpc_monitor/nwpc_log,该模块被多个项目同时使用。目录结构如下

|- nwpc_monitor
  |- nwpc_log
    |- __init__.py
    |- bunch.py
    |- node.py
    |- visitor.py

本例子目标是将 nwpc_log 提取为有完整版本记录的新项目,新项目目录如下

|- __init__.py
|- bunch.py
|- node.py
|- visitor.py

提取子目录

使用 git filter-branch 命令提取子目录。
格式为:

git filter-branch --prune-empty --subdirectory-filter FOLDER-NAME  BRANCH-NAME

其中
FOLDER-NAME 是想要提取的子目录,本示例使用 nwpc_monitor/nwpc_log 目录。
BRANCH-NAME 是当前项目的默认分支,本示例使用 master 分支。
具体命令为

$ git filter-branch --prune-empty --subdirectory-filter nwpc_monitor/nwpc_log master
Rewrite bd92d397ce438ce3a033bf81df818b282aec5527 (3/4) (1 seconds passed, remaining 0 predicted)
Ref 'refs/heads/master' was rewritten

通过 Gitk 可以看到目前的 master 分支保留了 nwpc_log 目录的版本历史。

现在项目中只包含子目录中的文件。尽管其他文件都被移除,但它们仍保留在 Git 历史里。

创建新项目

下面将该项目推送到新创建的Git项目中。在Github创建一个新项目。
查看原项目的 remote 地址

$ git remote -v
origin  git@github.com:perillaroc/nwpc-monitor-platform.git (fetch)
origin  git@github.com:perillaroc/nwpc-monitor-platform.git (push)

将 origin 地址改为新创建的Git项目地址

$ git remote set-url origin git@github.com:perillaroc/nwpc-log.git

新的 remote 地址为

$ git remote -v
origin  git@github.com:perillaroc/nwpc-log.git (fetch)
origin  git@github.com:perillaroc/nwpc-log.git (push)

推送到新的项目

$ git push -u origin master
Enter passphrase for key '/c/Users/wangdp/.ssh/id_rsa':
Counting objects: 15, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (9/9), done.
Writing objects: 100% (15/15), 2.95 KiB | 0 bytes/s, done.
Total 15 (delta 6), reused 15 (delta 6)
remote: Resolving deltas: 100% (6/6), done.
To github.com:perillaroc/nwpc-log.git
 * [new branch]      master -> master
Branch master set up to track remote branch master from origin.

参考

Splitting a subfolder out into a new repository