【问题标题】:Migrating unpushed local commits to new repository将未推送的本地提交迁移到新存储库
【发布时间】:2020-05-09 19:37:00
【问题描述】:

我们的存储库大小超出了允许的限制,我们现在被阻止推送任何本地提交。

因此我们使用bfg 删除大文件并重写存储库的整个历史记录,然后将其推送到新的存储库,同时其他开发人员生成了多个提交。

我想知道一种将我们无法推送到新存储库中的提交移动的简单方法?因为我不想手动应用每个更改。

【问题讨论】:

  • 理想情况下,您会要求您的开发人员在重写历史记录期间不要进行任何提交。您将需要使用git rebase 将未推送的提交重新定位到您的新历史记录中,然后您可以将它们推送到新的远程仓库。您需要先从新的仓库中获取/拉取。不要尝试按原样推送新的提交,因为这会推送带有大文件的旧历史记录。
  • 但是已经有一些提交无法从多个开发人员那里推送。不幸的是,这发生在周中

标签: git bfg-repo-cleaner


【解决方案1】:

我想我找到了一个基于question的不错的解决方案

我做了以下事情:

  1. 添加 oldRepo 远程指向旧存储库文件夹
git remote add oldRepo <oldRepoPath>/.git
git fetch oldRepo
  1. 对要迁移其提交的每个分支重复以下操作
git checkout <yourBranch>
git cherry-pick <OldestUnpushedCommitSHA>..<LatestsUnpushedCommitSHA>
git push
  1. 最后删除 oldRepo 远程
git remote remove oldRepo

【讨论】:

    【解决方案2】:

    以下是如何将所需提交移至新存储库的说明。 也许如果开发人员不是 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 的主分支上的新仓库

    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
    

    【讨论】:

      【解决方案3】:

      我想知道一种将我们无法推送到新存储库中的提交移动的简单方法?因为我不想手动应用每个更改。

      提交总是存储对其父提交的引用。因此,每次提交还存储项目的整个历史记录,直到第一次提交。因此,当您将提交“移植”到新项目中时,您还必须移植整个历史。

      你可以通过一个简单的git remote set-url 来实现这个(或者至少是非常接近的),然后强制推动你想要保留的分支。

      我认为,如果您不将提交纳入新的存储库,而仅将最新的树纳入其中,那么您将有一些有趣的可能性,而无需依赖复制整个历史记录。

      我认为最直接的方法就是将最新的工作树复制到新的存储库中并在那里签入。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-11-10
        • 2015-04-14
        • 1970-01-01
        • 2019-06-18
        • 2011-07-29
        • 2020-12-13
        • 1970-01-01
        相关资源
        最近更新 更多