将未推送的本地提交迁移到新存储库
Migrating unpushed local commits to new repository
我们有一个问题,我们的存储库大小超过了允许的限制,现在我们被阻止推送任何本地提交。
所以我们使用 bfg
删除大文件并重写存储库的整个历史然后将其推送到一个新的,同时其他开发人员产生了多个提交。
我想知道一种简单的方法来将我们无法推送的提交移动到新存储库中?因为我不想手动应用每个更改。
I want to know a simple way to move the commits that we couldn't push into the new repository? as I don't want to apply each change manually.
提交总是存储对其父提交的引用。因此每次提交也会存储项目的整个历史记录,直到第一次提交为止。所以当你 "transplant" 提交到一个新项目时,你也必须移植整个历史。
您可以通过简单的 git remote set-url 然后在您想要保留的分支上用力推动来实现这一点(或者至少是非常接近它的东西)。
我认为如果您不将提交提交到新的存储库中,而是只提交最新的树,您将有一些有趣的可能性,而不是依赖于复制整个历史记录。
我认为最直接的方法就是将最新的工作树复制到新的存储库中并在其中进行检查。
我想我找到了一个基于这个的很好的解决方案question
我做了以下事情:
- 添加指向旧存储库文件夹的 oldRepo 远程
git remote add oldRepo <oldRepoPath>/.git
git fetch oldRepo
- 为每个要迁移其提交的分支重复以下操作
git checkout <yourBranch>
git cherry-pick <OldestUnpushedCommitSHA>..<LatestsUnpushedCommitSHA>
git push
- 最后删除 oldRepo 远程
git remote remove oldRepo
下面是如何将所需提交移至新存储库的说明。
也许如果开发人员不是 git 专家,专家应该为他做这件事:
原始回购:
m1<-m2<-m3<-m4<--master
新回购:
m1a-m2a-m3a-m4a<--master
m1a-m4a have the large files removed
开发者回购:
origin/master|
V
m1<-m2<-m3<-m4<-a<-b<-c<--master
a,b,c need to be pushed to the new repo
第 1 步:从新存储库添加和获取新历史记录
git remote add newRepo <new repo url>
git fetch newRepo
开发者回购:
origin/master|
V
m1<-m2<-m3<-m4<-a<-b<-c<--master<--head
m1a<-m2a<-m3A<m4a<--newRepo/master
第 2 步:创建新的本地分支并挑选或重新提交新提交给它:
git checkout -b newRepo_master newRepo/master
git cherry-pick a b c
开发者回购:
origin/master|
V
m1<-m2<-m3<-m4<-a<-b<-c<--master
newRepo/master|
V
m1a<-m2a<-m3A<m4a<-aa<-ba<-ca<--newRepo_master (local branch)<-head
第 3 步:将新提交推送到 newRepo 主分支上的新 repo
git push --set-upstream newRepo master
第 4 步:(可选但推荐)移动本地 master 分支
git checkout -B master newRepo_master
git branch -D newRepo_master (delete temporary local branch)
开发者回购:
origin/master|
V
m1<-m2<-m3<-m4<-a<-b<-c
newRepo/master|
V
m1a<-m2a<-m3A<m4a<-aa<-ba<-ca<--master
新回购:
m1a-m2a-m3a-m4a<-aa<-ba<-ca<--master
我们有一个问题,我们的存储库大小超过了允许的限制,现在我们被阻止推送任何本地提交。
所以我们使用 bfg
删除大文件并重写存储库的整个历史然后将其推送到一个新的,同时其他开发人员产生了多个提交。
我想知道一种简单的方法来将我们无法推送的提交移动到新存储库中?因为我不想手动应用每个更改。
I want to know a simple way to move the commits that we couldn't push into the new repository? as I don't want to apply each change manually.
提交总是存储对其父提交的引用。因此每次提交也会存储项目的整个历史记录,直到第一次提交为止。所以当你 "transplant" 提交到一个新项目时,你也必须移植整个历史。
您可以通过简单的 git remote set-url 然后在您想要保留的分支上用力推动来实现这一点(或者至少是非常接近它的东西)。
我认为如果您不将提交提交到新的存储库中,而是只提交最新的树,您将有一些有趣的可能性,而不是依赖于复制整个历史记录。
我认为最直接的方法就是将最新的工作树复制到新的存储库中并在其中进行检查。
我想我找到了一个基于这个的很好的解决方案question
我做了以下事情:
- 添加指向旧存储库文件夹的 oldRepo 远程
git remote add oldRepo <oldRepoPath>/.git
git fetch oldRepo
- 为每个要迁移其提交的分支重复以下操作
git checkout <yourBranch>
git cherry-pick <OldestUnpushedCommitSHA>..<LatestsUnpushedCommitSHA>
git push
- 最后删除 oldRepo 远程
git remote remove oldRepo
下面是如何将所需提交移至新存储库的说明。 也许如果开发人员不是 git 专家,专家应该为他做这件事:
原始回购:
m1<-m2<-m3<-m4<--master
新回购:
m1a-m2a-m3a-m4a<--master
m1a-m4a have the large files removed
开发者回购:
origin/master|
V
m1<-m2<-m3<-m4<-a<-b<-c<--master
a,b,c need to be pushed to the new repo
第 1 步:从新存储库添加和获取新历史记录
git remote add newRepo <new repo url>
git fetch newRepo
开发者回购:
origin/master|
V
m1<-m2<-m3<-m4<-a<-b<-c<--master<--head
m1a<-m2a<-m3A<m4a<--newRepo/master
第 2 步:创建新的本地分支并挑选或重新提交新提交给它:
git checkout -b newRepo_master newRepo/master
git cherry-pick a b c
开发者回购:
origin/master|
V
m1<-m2<-m3<-m4<-a<-b<-c<--master
newRepo/master|
V
m1a<-m2a<-m3A<m4a<-aa<-ba<-ca<--newRepo_master (local branch)<-head
第 3 步:将新提交推送到 newRepo 主分支上的新 repo
git push --set-upstream newRepo master
第 4 步:(可选但推荐)移动本地 master 分支
git checkout -B master newRepo_master
git branch -D newRepo_master (delete temporary local branch)
开发者回购:
origin/master|
V
m1<-m2<-m3<-m4<-a<-b<-c
newRepo/master|
V
m1a<-m2a<-m3A<m4a<-aa<-ba<-ca<--master
新回购:
m1a-m2a-m3a-m4a<-aa<-ba<-ca<--master