如何将GitHub项目中的子目录创建到新的存储库中?

时间:2014-08-10 00:02:43

标签: git github git-filter-branch

我最近在GitHub的一个项目中移动了几个子目录,我很好奇将子目录克隆到新项目的最佳方法。具体来说,我希望在这些新项目的提交消息中提及任何问题都指向旧项目。

1 个答案:

答案 0 :(得分:3)

尽管hype around new commands like git subtree split,从旧Git项目的子目录中创建新Git项目的最佳方法仍然是克隆项目,然后使用git filter-branch --subdirectory-filter重写项目的历史记录仅包含给定的子目录。

然而,使用GitHub,还有一些工作要做 - 如果你从一个旧项目提交到一个新的存储库,你可能会在你的提交消息中引用问题来解决这个问题。原始存储库(例如Fixes #3)。如果您要在其他项目中重复使用这些提交,则需要将它们转换为对原始存储库中的问题的显式引用(例如Fixes stuartpb/mothership#3 ),以便"新"分离项目中的提交将链接到该原始问题,并且赢得链接到任何项目的问题。

幸运的是,git filter-branch提供了一个过滤提交消息的选项,所以我们可以通过几个命令来完成所有这些:

  • $ WORK_DIR指的是您要检查项目的目录。
  • $ SUB_DIR是您要转换为单独项目的子目录。
  • $ ORIGINAL_REPO是项目的用户名和回购名称,其中包含您要拆分的子目录。
  • $ NEW_REPO是您要将 new repo推送到的用户名和回购名称。

命令,从头到尾:

git clone https://github.com/$ORIGINAL_REPO $WORK_DIR && cd $WORK_DIR
git filter-branch --subdirectory-filter $SUB_DIR --msg-filter 'sed -re
  "s=(^| )(#[0-9]+)=\1'$ORIGINAL_REPO'#\2"=g' -- --all
git remote set-url origin git@github.com:$NEW_REPO.git
git push -u origin master