我尝试在大型存储库上运行git lfs migrate import --everything --include="*.dll"
。在我运行这个之前,大约有70000个提交。在运行迁移(以及过期的reflog和修剪等(之后,git rev-list --all --count
显示了大约130k个提交。为什么添加了这么多提交,这些提交是什么?
检查问题3238是否不是您案例中的原因
简而言之,标记可能仍然引用旧的提交(并且它的所有父级仍然由git rev-list
计数(
搜索是否有一些标记仍指向
git lfs migrate
支持迁移的旧OID
您可以将这些信息输入到--object-map=mapping_file.map.txt
文件中
以下脚本应在git存储库中执行。它不会在存储库中进行任何修改,直到您取消回显git标记命令。。。
MAP_FILE=../mapping_file.map.txt
git for-each-ref | grep tags | while read -r oid type tag; do
while IFS=, read -r old_oid new_oid; do
if [[ "$oid" == "$old_oid" ]]; then
echo TAG $tag still pointing to old_oid $old_oid instead of $new_oid
echo git tag -f $(basename $tag) $new_oid
fi
done < $MAP_FILE
done
注意,地图文件来自以下注释:
在某些特定条件下(我不知道(,
lfs migrate import
无法将refs(标记、分支(从旧提交移动到新创建的提交
因此,";CCD_ 7";无法删除旧的提交
不幸的是,我们的数据库不可共享,但我可以尝试描述我们摆脱这些旧提交的方法。
- 在运行
lfs migrate import
时创建一个映射文件(--object-map=
(,以获取lfs创建的旧提交和新提交之间的相关性- 从原始数据库和正在工作的lfs数据库(
git rev-list –all
(中收集所有提交- 识别所有所谓的双重提交。这些是存在于原始和工作lfs数据库中的提交
- 为仍然存在的ref(
git show –s
(检查这些双重提交,并使用以下git命令手动或通过脚本将每个找到的ref移动到相应的新提交(从创建的映射文件中(:git tag –f
、git update-ref
- 运行
git gc –prune=now
并在工作lfs数据库中检查提交计数
在@torek的评论帮助下,我设法弄明白了这一点。如上所述,git rev-list --branches --tags
列出了正确的提交次数。
存储库是通过使用git-tfs将TFVC存储库转换为git创建的。运行git for-each-ref
在refs/remotes/tfs
下列出了一组refs,这些refs在运行git remote -v
时没有显示,因为它们被列为提交。所以很可能这些引用了一堆git lfs migrate
并没有重写的旧提交,而且很明显,这些引用并没有像预期的那样被git-lfs-migrate更新。
使用git update-ref -d
删除所有这些引用,然后进行另一次gc,似乎已经解决了这个问题,存储库恢复到了原来的提交次数。