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