我最近在GitHub的一个项目中移动了几个子目录,我很好奇将子目录克隆到新项目的最佳方法。具体来说,我希望在这些新项目的提交消息中提及任何问题都指向旧项目。
答案 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
提供了一个过滤提交消息的选项,所以我们可以通过几个命令来完成所有这些:
命令,从头到尾:
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