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
如何将特定提交之上的所有提交移动到Git中的新存储库?_Git_Github - Fatal编程技术网

如何将特定提交之上的所有提交移动到Git中的新存储库?

如何将特定提交之上的所有提交移动到Git中的新存储库?,git,github,Git,Github,我目前正在从事一个项目,我正在使用Git进行版本控制 该项目与其他几个项目位于存储库中。每个项目都有自己的目录 虽然除当前项目外的所有项目都非常小,它们可以保存在一个存储库中,但我想将当前项目移动到它自己的Git存储库中 我现在的问题是,如何将特定提交顶部的所有提交移动到新存储库 如果有人能告诉我如何实现这一点,我将非常高兴。您可以克隆项目并指定选项。要限制您进行的提交的数量,只需删除其他项目就可以了 这并不是您想要的解决方案,您只需计算要执行的提交数量,并将其设置为克隆的深度。免责声明这可能不

我目前正在从事一个项目,我正在使用Git进行版本控制

该项目与其他几个项目位于存储库中。每个项目都有自己的目录

虽然除当前项目外的所有项目都非常小,它们可以保存在一个存储库中,但我想将当前项目移动到它自己的Git存储库中

我现在的问题是,如何将特定提交顶部的所有提交移动到新存储库


如果有人能告诉我如何实现这一点,我将非常高兴。

您可以克隆项目并指定选项。要限制您进行的提交的数量,只需删除其他项目就可以了


这并不是您想要的解决方案,您只需计算要执行的提交数量,并将其设置为克隆的深度。

免责声明这可能不是最干净的解决方案,但它可以执行“将多个提交从repo A移动到repo B”的任何要求

这可以通过生成和应用一组补丁来实现

# in repo A
git format patch <sha1 of commit to count from>
# this will produce a bunch of XXXX-<Commit comment>.patch files 
# move those files in newly created repo B
cd <path to repo b>
cp <path to repo a>/*.patch .
git am *.patch # replay patches on top of fresh repo
回购A中的
#
git格式修补程序
#这将产生一组XXXX-.patch文件
#在新创建的repo B中移动这些文件
光盘
cp/*.patch。
git am*.patch#在新回购协议上重播补丁
更新


找到了一个更好的解决方案-这可能正是您所需要的。

首先,我们将创建一个变量,它是一个目录文件的所有提交列表,按从最早到最新的顺序排列:

folder=<new project>
sha=$(echo $(for x in $(git log --format=oneline --follow $folder| awk '{print $1;}'); do echo $x; done) | awk '{ for (i=NF; i>1; i--) printf("%s ",$i); print $1; }')
总而言之,我们将删除到旧项目的远程链接。看到您用github标记了这篇文章,我们还将为github设置一个新的

git remote rm $old
git remote add origin <url for the new project you created>
git远程rm$old
git远程添加源

据我所知,您有一个包含多个项目的回购协议,如下所示:

projects/
    project1/
    project2/
    project3/
    project4/
您希望将
project3
转换为自己的存储库

Github提供了您应该能够使用的说明

  • 重新克隆旧回购协议(或复制现有回购协议)
  • 将点更改为新回购
    git远程设置url源
    。首先这样做很重要,以避免意外推到旧回购
  • 用于删除除所需子目录以外的所有内容<代码>git筛选器分支--删除空--子目录筛选器项目3主目录。
    project3/
    中的所有文件现在都应该位于根目录中
  • 推动新的回购协议<代码>git推送原始主机
  • 满意后,转到原始回购克隆,并从旧回购中删除
    project3/
    <代码>吉特rm项目3
  • 如果推送被拒绝,不要强制推送!检查
    origin
    是否使用
    git remote-v
    指向新存储库,并且新存储库是否为空


    project3
    中的所有文件现在都应该位于目录的顶部。其余的项目将以旧回购协议的形式安全撤离。如果运行
    git log
    ,您仍然会看到所有涉及这些文件的提交。这就好像
    project3
    始终是存储库中的唯一内容。

    您能否澄清
    如何将特定提交顶部的所有提交移动到新存储库?
    这是否意味着您希望在新的repo中有一组连续的提交?或者这是否意味着您希望文件夹中的所有提交都处于新的重新发布中?Github提供了相关说明。我认为所有其他答案也将为我的问题提供解决方案,但根据我的意见,这是最容易理解和最干净的解决方案。
    git remote rm $old
    git remote add origin <url for the new project you created>
    
    projects/
        project1/
        project2/
        project3/
        project4/