Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/github/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将GitHub项目中的子目录转换为新的存储库?_Git_Github_Git Filter Branch - Fatal编程技术网

如何将GitHub项目中的子目录转换为新的存储库?

如何将GitHub项目中的子目录转换为新的存储库?,git,github,git-filter-branch,Git,Github,Git Filter Branch,我最近在GitHub上的一个项目中移动了几个子目录,我很好奇将子目录克隆到新项目中的最佳方法。具体地说,我希望这些新项目的提交消息中提到的任何问题都指向旧项目。尽管如此,从旧Git项目的子目录创建新Git项目的最佳方法仍然是克隆该项目,然后使用重写项目的历史记录以仅包括给定的子目录 但是,使用GitHub,还有一点工作要做——如果您要将旧项目的提交提交到新的存储库中,您可能会在提交消息中引用该原始存储库中的问题(例如Fixes#3)。如果要在另一个项目中重复使用这些提交,则需要将它们转换为对原始

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

尽管如此,从旧Git项目的子目录创建新Git项目的最佳方法仍然是克隆该项目,然后使用重写项目的历史记录以仅包括给定的子目录

但是,使用GitHub,还有一点工作要做——如果您要将旧项目的提交提交到新的存储库中,您可能会在提交消息中引用该原始存储库中的问题(例如
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”没有问题跟踪器,这是这个答案的一半内容与寻址有关。