将没有root的分支推送到新存储库

问题描述 投票:1回答:1

想象一下,我有主分支。一旦创建了新分支。现在,我想将此分支准确地移动到新的存储库,而不会在创建此分支之前提交注释。

图片:1。旧存储库

newbranch    C - D - E
            /
master A - B

图片:2。新的存储库

newbranch     C - D - E
             /
master      Z

我不需要移动newbranch,我尝试了它,但它花了所有以前的历史。我也熟悉可以帮助我删除提交的rebase。但关键是我不希望在我的新回购中看到超过1000个提交。我无法在rebase模式下手动删除它。

我只需要向人们展示这个新分支 - 在这个分支期间所做的是什么,而不是先前的承诺。

非常感谢您的回复!

git
1个回答
0
投票

你至少可以在新的仓库中创建一个孤儿分支。 (git checkout --orphan),并在其中进行一次虚拟提交。 或者只是从Z创建一个新分支(仍在您的新回购中)

这假设您在本地克隆了旧的repo。 并且您已经在本地创建了一个新的仓库。

cd c:\a\path
git init create newrepo
cd newrepo.

首先,确保您的旧仓库在B处签出(即代表分支前的提交的SHA1)

cd C:\path\to\old\repo
git checkout B

然后将该内容导入新的空仓库

cd C:\a\path\newrepo
git --work-tree=C:\path\to\old\repo add .
git commit -m "Import old repo as Z"

您可以在新的repo中获取旧的repo,并在新的分支上重新提交您的提交。

cd C:\a\path\newrepo
git remote add oldrepo C:\path\to\old\repo
git fetch oldrepo

git checkout -b newbranch

git rebase --onto newbranch C~ oldrepo/newbranch

这将只重新创建您在新回购中提交的提交。


但是:rebase可能有问题,并且有很多merge conflicts to be resolved manually

在你的情况下,你可以完全避免使用git replace,或者在你的情况下git graft points,就像看到in this example。 按照过去的说明直到git fetch oldrepo步骤,然后:

git fetch oldrepo
git checkout -b newbranch oldrepo/newbranch
echo SHA1(C) SHA1(Z) > .git/info/grafts

(将SHA1(xxx)替换为提交xxx的SHA1。Z是新回购中的新提交,C是旧回购中newbranch的第一次提交)

这将声明Z作为C的父提交(此处不需要合并/ rebase)。 要使其永久化,请使用git filter-branch

git filter-branch --tag-name-filter cat -- newbranch
rm .git/info/grafts

然后,您可以推送新的重新分支。

git remote add origin /url/of/new/remote/repo

git push -u origin master
git push -u origin newbranch
© www.soinside.com 2019 - 2024. All rights reserved.