我最近在 GitHub 上的一个项目中移动了几个子目录,我很好奇将子目录克隆到新项目中的最佳方法。具体来说,我希望这些新项目的提交消息中提到的任何问题都指向旧项目。
最佳答案
尽管存在 hype around new commands like git subtree split
,从旧 Git 项目的子目录创建新 Git 项目的最佳方法仍然是克隆该项目,然后使用 git filter-branch --subdirectory-filter
重写项目的历史记录以仅包含给定的子目录。
但是,对于 GitHub,还有更多工作要做 - 如果您要将旧项目的提交提交到新存储库中,则您的提交消息中可能会引用原始存储库中的问题(例如 Fixes #3
)。如果您要在另一个项目中重复使用这些提交,则需要将它们转换为对原始存储库中问题的显式引用(例如 Fixes stuartpb/mothership#3
),以便"new"分离项目中的提交将链接到该原始问题,并且不会链接到任何新项目的问题。
幸运的是,git filter-branch
还提供了一个过滤提交消息的选项,因此我们只需几个命令即可完成所有这些操作:
- $WORK_DIR 是指您想要 check out 项目的目录。
- $SUB_DIR 是您要转换为单独项目的子目录。
- $ORIGINAL_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 <a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="afc8c6dbefc8c6dbc7dacd81ccc0c2" rel="noreferrer noopener nofollow">[email protected]</a>:$NEW_REPO.git
git push -u origin master
关于git - 如何将 GitHub 项目中的子目录创建为新存储库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25224258/