我有一个已达到特定存储空间的现有存储库。
但是,现在我想将几个分支从旧的移植到一个新的存储库,没有旧历史的包袱(因为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
编辑:提前谢谢,原谅我的粗鲁。
答案 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),因此您的继续开发具有与旧历史记录的可跟踪连接,即使它不在新的回购。 (当然,要实际跟踪旧历史记录,您必须查看旧回购,但至少可以这样做。)
如果你需要选择分支,或者为不同的分支设置不同的深度,或者确保深度足以捕获分支点....这一切都可以完成,尽管需要更多的工作。