为什么git-lfs迁移后提交数量会增加



我尝试在大型存储库上运行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";无法删除旧的提交
不幸的是,我们的数据库不可共享,但我可以尝试描述我们摆脱这些旧提交的方法。

  1. 在运行lfs migrate import时创建一个映射文件(--object-map=(,以获取lfs创建的旧提交和新提交之间的相关性
  2. 从原始数据库和正在工作的lfs数据库(git rev-list –all(中收集所有提交
  3. 识别所有所谓的双重提交。这些是存在于原始和工作lfs数据库中的提交
  4. 为仍然存在的ref(git show –s(检查这些双重提交,并使用以下git命令手动或通过脚本将每个找到的ref移动到相应的新提交(从创建的映射文件中(:git tag –fgit update-ref
  5. 运行git gc –prune=now并在工作lfs数据库中检查提交计数

在@torek的评论帮助下,我设法弄明白了这一点。如上所述,git rev-list --branches --tags列出了正确的提交次数。

存储库是通过使用git-tfs将TFVC存储库转换为git创建的。运行git for-each-refrefs/remotes/tfs下列出了一组refs,这些refs在运行git remote -v时没有显示,因为它们被列为提交。所以很可能这些引用了一堆git lfs migrate并没有重写的旧提交,而且很明显,这些引用并没有像预期的那样被git-lfs-migrate更新。

使用git update-ref -d删除所有这些引用,然后进行另一次gc,似乎已经解决了这个问题,存储库恢复到了原来的提交次数。

最新更新