gpt4 book ai didi

git - 将旧 git 历史记录添加到新存储库

转载 作者:行者123 更新时间:2023-12-01 15:32:45 24 4
gpt4 key购买 nike

我创建了一个 git 存储库并将内容提交给它。

git clone git://newrepo.com/project.git # Empty repository
tar -xzvf project-0.6.tar.gz -C project # Fill it with tar contents
cd project
git commit -a
... Do work
... Commit
... Push

但后来发现了一个带有 git 历史的同一个项目的恢复版本,它是用早期版本的 tar.gz 制作的。

如何将旧项目的历史记录导入新项目?

我想我需要做这样的事情:
git clone git://newrepo.com/project.git                 # Start fresh
cp -r project project_backup # Backup the content
cd project
git init # Wipe everything
git remote set-url origin git://oldrepo.com/project.git # Point to the old project
git pull # Get clean history
cp -r ../project_backup . # Apply new content
git commit -a # One big commit
git remote set-url origin git://newrepo.com/project.git # Point to the new project
git push # Push changes

但我不认为 git init像那样工作。 man说它实际上并没有触及 git 历史。听说 git rebase可能是解决方案,但我不确定如何在这种情况下使用它。

以 git-manpage 格式:我会转这个:
A---B---C master (oldrepo)

D---E---F master (newrepo)

进入
A---B---C---D'---E'---F' master (newrepo)

编辑:

我确实拥有对 oldrepo 的推送访问权限.我确信我可以弄清楚如何将我的更改应用到 oldrepo ,但是我将如何替换 newrepooldrepo ?

编辑2
git rebase有人建议。我有问题。当我解决冲突并完成 rebase 时,
git clone git@newrepo.com/project.git project-rebase
cd project-rebase
git fetch --all
git remote add original https://oldrepo.com/project-old.git
git fetch original
git rebase --onto original/master 6210d0b3cf20f506ce0bab7849550b38c9effb15 master
--- resolving conflict ---
git rebase --continue

在这一点上,我希望我们已经完成了。 git log看起来不错,但是:
$ git status
On branch master
Your branch and 'origin/master' have diverged,
and have 102 and 11 different commits each, respectively.
(use "git pull" to merge the remote branch into yours)

nothing to commit, working tree clean'

$ git push origin master
To newrepo.com:project.git
! [rejected] master -> master (non-fast-forward)
error: failed to push some refs to 'git@newrepo.com:project.git'
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Integrate the remote changes (e.g.
hint: 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.

最佳答案

多亏了 Schwern 的出色开端,问题才得以解决。这是整个解决方案:

git clone git@newrepo.com:project.git
cd project
git fetch --all
git remote add original https://oldrepo.com/project-old.git
git fetch original
git rebase --onto original/master 6210d0b3cf20f506ce0bab7849550b38c9effb15 master

# Manual resolution of conflict

git rebase --continue
git push --force origin master # Need to disable branch protection in gitlab
# Re-enable protection in gitlab

我错过了 --force它将整个远程分支替换为您本地修改的分支。由于我的 repo 在 gitlab 中,因此 master 分支受到保护,并且 --force不被允许。为了使该命令成功,我不得不暂时解除对 master 的保护。

然后我继续每个分支:
git checkout --track origin/upstream
git rebase --onto original/upstream 6210d0b3cf20f506ce0bab7849550b38c9effb15
# Manual resolution of conflict
git rebase --continue
gir push --force origin upstream

我的最后一个分支没有冲突,所以这个很简单:
git checkout --track origin/pristine-tar
git rebase --onto original/pristine-tar 6210d0b3cf20f506ce0bab7849550b38c9effb15
git push --force origin pristine-tar

关于git - 将旧 git 历史记录添加到新存储库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53306664/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com