仓库迁移问题记录
参考链接
仓库带commit记录迁移
case如下:
有2个git仓库:repo1、repo2;
想将repo1中的文件移入repo2;
repo1的历史日志要保留。
大致思路是伪造远程的repo1仓库为repo2的一个分支,然后合并进来;
若是文件有冲突、或要建立子目录,建议在repo1中先解决,再进行如上操作。
- 将repo1作为远程仓库,添加到repo2中,设置别名为other
[jot@myhost repo2]$ git remote add other ../repo1/
- 从repo1仓库中抓取数据到本仓库
[jot@myhost repo2]$ git fetch other
- 将repo1仓库抓取的master分支作为新分支checkout到本地,新分支名设定为repo1
[jot@myhost repo2]$ git checkout -b repo1 other/master
- 切换回repo2的master分支
[jot@myhost repo2]$ git checkout master
Switched to branch 'master'
- 将repo1合并入master分支
[jot@myhost repo2]$ git merge repo1
merge过程中解决冲突后使用git merge --continue 继续
清理大文件记录
- 识别出最大的三个文件
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}')"
- 查询大文件的文件名
git rev-list --objects --all | grep 829b9d04b876f058b56849f7296c270a12f3ce04
- 将该文件从历史记录的所有 tree 中移除
git filter-repo --invert-paths --path "path_to_filename_needs_to_removed"
- 清理和回收空间(可省略)
虽然上面我们已经删除了文件, 但是我们的repo里面仍然保留了这些objects, 等待垃圾回收(GC), 所以我们要用命令彻底清除它, 并收回空间,命令如下:
rm -rf .git/refs/original/
git reflog expire --expire=now --all
git gc --prune=now
至此,我们已经彻底的删除了我们不想要的文件。
- 推送修改后的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>