Git仓库迁移保留commit

仓库迁移问题记录

参考链接

使用git filter-repo

删除git记录中的大文件

彻底删除git中的大文件

git目录下object文件过大清理

仓库带commit记录迁移

case如下:

有2个git仓库:repo1、repo2;

想将repo1中的文件移入repo2;

repo1的历史日志要保留。

大致思路是伪造远程的repo1仓库为repo2的一个分支,然后合并进来;

若是文件有冲突、或要建立子目录,建议在repo1中先解决,再进行如上操作。

  1. 将repo1作为远程仓库,添加到repo2中,设置别名为other
[jot@myhost repo2]$ git remote add other ../repo1/
  1. 从repo1仓库中抓取数据到本仓库
[jot@myhost repo2]$ git fetch other
  1. 将repo1仓库抓取的master分支作为新分支checkout到本地,新分支名设定为repo1
[jot@myhost repo2]$ git checkout -b repo1 other/master
  1. 切换回repo2的master分支
[jot@myhost repo2]$ git checkout master

Switched to branch 'master'
  1. 将repo1合并入master分支
[jot@myhost repo2]$ git merge repo1

merge过程中解决冲突后使用git merge --continue 继续

清理大文件记录

  1. 识别出最大的三个文件
git verify-pack -v .git/objects/pack/pack-*.idx | sort -k 3 -n | tail -3

git rev-list --objects --all | grep "$(git verify-pack -v .git/objects/pack/*.idx | sort -k 3 -n | tail -5 | awk '{print$1}')"
  1. 查询大文件的文件名
git rev-list --objects --all | grep 829b9d04b876f058b56849f7296c270a12f3ce04
  1. 将该文件从历史记录的所有 tree 中移除
git filter-repo --invert-paths --path "path_to_filename_needs_to_removed"
  1. 清理和回收空间(可省略)

虽然上面我们已经删除了文件, 但是我们的repo里面仍然保留了这些objects, 等待垃圾回收(GC), 所以我们要用命令彻底清除它, 并收回空间,命令如下:

rm -rf .git/refs/original/

git reflog expire --expire=now --all

git gc --prune=now

至此,我们已经彻底的删除了我们不想要的文件。

  1. 推送修改后的repo

以强制覆盖的方式推送你的repo, 命令如下:

git push --force

使用到的指令

git

git submodule remove <name>

git remote add <name> <url>

git filter-repo --invert-paths

git merge --allow-unrelated-histories

git cherrypick

git verify-pack -v

git checkout -b <branch_name> <remote_branch>

git count-objects -v

bash

du -d 1 -h

sort -k <index> -n

tail -<index>