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

标签 git github git-filter-branch

我最近在 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/

相关文章:

git - 如何在不输入凭据的情况下从 powershell 进行 git 克隆?

git 删除 Remote : remote refs do not exist

git - 在 git 中添加补丁,所有 hunks 匹配文件中的正则表达式

git - git 对于多语言实现的最佳实践是什么?

git - 混淆编写 git filter-branch 将所有文件移动到子目录

Django:Heroku 无法启动,at=error code=H10 desc ="App crashed"

github - 无法将主机添加到已知主机列表

git - "git reset --hard"命令没有删除不必要的提交

git - 如何使用 index-filter & co 从 Git 仓库中提取一个具有提交历史的文件?

git - 为什么大文件在用 filter-branch 清理后仍然存在于我的 packfile 中?