仅将近期历史推到新的Git回购

仅将近期历史推到新的Git回购,git,Git,我有一个遗留的存储库,由于LFS和不再可访问的文件的错误引导而被损坏。结果是,它需要访问不再存在的文件才能推送到新的存储库,或者对历史进行大手术,这一次似乎太难/太危险了。我想尝试创建一个新的存储库,只推送最近的历史,以避免旧的和错误的提交。比如说,自某个日期或从某个提交开始的所有提交。这可能吗 为什么不在第一次“良好”提交之前删除所有内容 一个简单的方法: git rebase -i --root 系统会显示一个从开始到结束的所有提交的相反顺序列表,例如 pick aa48e9c start

我有一个遗留的存储库,由于LFS和不再可访问的文件的错误引导而被损坏。结果是,它需要访问不再存在的文件才能推送到新的存储库,或者对历史进行大手术,这一次似乎太难/太危险了。我想尝试创建一个新的存储库,只推送最近的历史,以避免旧的和错误的提交。比如说,自某个日期或从某个提交开始的所有提交。这可能吗


为什么不在第一次“良好”提交之前删除所有内容

一个简单的方法:

git rebase -i --root
系统会显示一个从开始到结束的所有提交的相反顺序列表,例如

pick aa48e9c start
pick e10b625 middle
pick 6691860 finished up
比方说,我们想摆脱“开始”和“中间”,但保持“结束”。所以只需删除这两行并保存

pick 6691860 finished up

将创建一个人工空的首次提交,但错误的提交将消失。可能会有一些冲突需要解决,但这并不困难。

也许您可以尝试
git-rebase--on
(请参阅)功能,其中

  • 新基地
  • sha2:将被复制的第一次提交的父级(sha2本身不会被复制)
  • sha3:将复制的最后一次、最近一次提交
因此,总的来说是这样的:

  • 设置名为
    newRepo
  • newRepo
    中创建初始提交以初始化主分支
  • oldRepo
  • 使用
    git-rebase--on
    将旧的有效提交范围复制到新的回购
  • 清理对旧回购协议的引用

  • 另外,值得注意的是,这只会编辑一个特定分支上的历史记录,只要这就是推送到新的远程存储库所需的全部内容,就可以了。如果需要保留任何其他分支或标记,可能需要更复杂的重写。从技术上讲,它也不会删除旧的提交,而是重新创建新的提交;这是一个微妙的区别,但值得记住,以了解它将如何与其他操作交互。@IMSoP谢谢,两个都正确
    mkdir newRepo
    cd newRepo
    git init
    
    touch temp_file_for_initial_commit
    git add .
    git commit -m "Initial commit of new corruption-free repository"
    
    git add origin "/path/to/oldRepo" # notice it could just be a path to the local repo
    git fetch origin
    
    git rebase --onto master <sha of parent of first commit> <sha of latest commit>
    
    git checkout -b latest-history-on-new-repo
    
    
    git remote remove origin