如何将分支从一个存储库移植到一个没有历史记录的新存储库?

时间:2017-03-23 16:04:12

标签: git

我有一个已达到特定存储空间的现有存储库。

但是,现在我想将几个分支从旧的移植到一个新的存储库,没有旧历史的包袱(因为git历史是该存储问题的罪魁祸首)

是否有任何git命令或命令序列可以帮助我做到这一点?

e.g

cd old_repo/
git checkout old_repo_old_branch

git remote add origin new_repo
git push origin new_repo_new_branch ?? // Does this preserve the history

编辑:提前谢谢,原谅我的粗鲁。

3 个答案:

答案 0 :(得分:2)

  

git push origin new_repo_new_branch ?? //这会保留历史吗

是的,new_repo_new_branch会保留历史记录。

您可以结帐带有--orphan标记的新分支。这将删除所有先前的提交历史记录。

$ cd old_repo/
$ git checkout old_repo_old_branch

$ git checkout --orphan new-branch       # checkout a new branch (say, new-branch) cleaning all previous commit histories
$ git log                                # see commit history is empty

$ git remote add newrepo <new-repo-url>  # add a new remote (say, newrepo) with new-repo-url
$ git push -u newrepo HEAD               # push to newrepo/new-branch 

答案 1 :(得分:2)

你可以用很好的旧cp来做到这一点:

# create a new repo
git init new_repo

# fetch the content from the old repo
cd old_repo
git archive --format=tar master > ../new_repo/data.tar

# unpack the old content and...
cd ../new_repo
tar xf data.tar

# add it to the new repo
git add .
git commit -m 'clean slate'

重复其他分支,从new_repo开始:

git checkout --orphan branch-foo
cd ../old-repo
git archive --format=tar branch-foo > ../new_repo/data.tar
# rinse and repeat like above

答案 2 :(得分:1)

我想当你谈到遗留历史包袱时,这完全取决于你的想法,但我认为最简单的解决方案可能是一个浅层克隆。

如果您想要,例如,每个分支上最近的5次提交,您可以

git clone --depth=5 --no-single-branch url-for-old-repo

(请注意,如果您只提供本地文件路径,depth选项将无效;如果原点是本地的,则必须使用以file:开头的网址。)

这比其他人建议的方法有一些优势。您的新repo包含原始仓库中的相同的提交(具有原始的SHA1 ID),因此您的继续开发具有与旧历史记录的可跟踪连接,即使它不在新的回购。 (当然,要实际跟踪旧历史记录,您必须查看旧回购,但至少可以这样做。)

如果你需要选择分支,或者为不同的分支设置不同的深度,或者确保深度足以捕获分支点....这一切都可以完成,尽管需要更多的工作。