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

时间:2016-05-19 18:18:56

标签: git github

我目前正在开发一个项目,我正在使用Git进行版本控制。

该项目位于包含其他一些项目的存储库中。每个项目都有自己的目录。

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

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

如果有人能告诉我如何实现这一点,我会很高兴。

4 个答案:

答案 0 :(得分:1)

据我所知,你有一个包含多个项目的回购:

projects/
    project1/
    project2/
    project3/
    project4/

您希望将project3转换为自己的存储库。

Github有splitting a subfolder out into a new repository的说明,你可以使用它。

  1. 重新制作旧回购(或复制现有回购)。
  2. remote更改为指向新的回购。 git remote set-url origin <new repo url>。重要的是首先要做到这一点,以避免意外地推进旧的回购。
  3. 使用git filter-branch修剪除所需子目录以外的所有内容。 git filter-branch --prune-empty --subdirectory-filter project3 masterproject3/中的所有文件现在都应位于根目录中。
  4. 推送到新的回购。 git push origin master
  5. 一旦您满意,请转到回购的原始克隆并从旧回购中删除project3/git rm project3
  6. 如果推送被拒绝请勿强行推送!检查origin是否使用git remote -v指向新存储库,并且新存储库为空。

    project3中的所有文件现在应该位于目录的顶部。其余的项目将在旧的仓库中安全地消失。如果您运行git log,您仍会看到触及这些文件的所有提交。就好像project3始终是存储库中唯一的东西。

答案 1 :(得分:0)

您可以克隆项目并指定--depth选项。要限制你携带的提交数量,只需删除其他项目,留下你想要的那个。

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

答案 2 :(得分:0)

免责声明这可能不是最干净的解决方案,但它可以做任何问题“将多次提交从回购A转移到回购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

<强>更新

使用git-subtree找到了更好的解决方案 - 这可能正是您所需要的。

答案 3 :(得分:0)

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

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; }')

对不起大号1班轮。

你想制作一个新的回购。您希望能够从旧项目中选择提交到新项目的提交。我们需要将远程设置为旧的repo,但只需接受我们想要的提交。

old=<old project name>
cd ..
mkdir $folder
cd $folder
git init
git remote add $old $(pwd)/$old

所以现在我们可以通过我们之前发现的提交哈希来获取提交。

for x in $sha; do git cherry-pick $x; done

要将它全部包装起来,我们将删除远程链接到旧项目。看到你用github标记了这篇文章,我们也将为github设置一个新帖子。

git remote rm $old
git remote add origin <url for the new project you created>