如何将GitHub项目中的子目录转换为新的存储库?
我最近在GitHub上的一个项目中移动了几个子目录,我很好奇将子目录克隆到新项目中的最佳方法。具体地说,我希望这些新项目的提交消息中提到的任何问题都指向旧项目。尽管如此,从旧Git项目的子目录创建新Git项目的最佳方法仍然是克隆该项目,然后使用重写项目的历史记录以仅包括给定的子目录 但是,使用GitHub,还有一点工作要做——如果您要将旧项目的提交提交到新的存储库中,您可能会在提交消息中引用该原始存储库中的问题(例如如何将GitHub项目中的子目录转换为新的存储库?,git,github,git-filter-branch,Git,Github,Git Filter Branch,我最近在GitHub上的一个项目中移动了几个子目录,我很好奇将子目录克隆到新项目中的最佳方法。具体地说,我希望这些新项目的提交消息中提到的任何问题都指向旧项目。尽管如此,从旧Git项目的子目录创建新Git项目的最佳方法仍然是克隆该项目,然后使用重写项目的历史记录以仅包括给定的子目录 但是,使用GitHub,还有一点工作要做——如果您要将旧项目的提交提交到新的存储库中,您可能会在提交消息中引用该原始存储库中的问题(例如Fixes#3)。如果要在另一个项目中重复使用这些提交,则需要将它们转换为对原始
Fixes#3
)。如果要在另一个项目中重复使用这些提交,则需要将它们转换为对原始存储库中问题的显式引用(例如Fixes stuartpb/mothership#3
),以便将分离项目中的“新”提交链接到该原始问题,不会与新项目的任何问题联系起来
幸运的是,git filter branch
还提供了一个过滤提交消息的选项,因此我们只需几个命令就可以完成这一切:
- $WORK_DIR是指要将项目签出到的目录
- $SUB_DIR是要转换为单独项目的子目录
- $ORIGINAL_REPO是包含要拆分的子目录的项目的用户名和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
可能重复为什么要添加新问题/答案而不是仅将答案添加到?因为我的问题/答案是特定于GitHub的。其他的问题只是关于一般的Git存储库,人们没有理解的是Github就是Git。上面的命令只是如何从控制台执行。呃,“Git”没有问题跟踪器,这是这个答案的一半内容与寻址有关。