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

时间:2020-09-20 00:11:59

标签: git git-lfs git-lfs-migrate

我尝试在大型存储库上运行git lfs migrate import --everything --include="*.dll"。在我运行之前,大约进行了7万次提交。在运行迁移(并且过期reflog和修剪等)之后,git rev-list --all --count显示大约13万次提交。为什么添加了这么多提交,这些提交是什么?

2 个答案:

答案 0 :(得分:1)

检查是否不是issue 3238的起因。 简而言之,标记可能仍引用旧的提交(并且其所有父对象仍将由git rev-list计算)

搜索是否有一些标记仍指向旧的OID,这些标记应被git lfs migrate迁移。
您会将此类信息保存到--object-map=mapping_file.map.txt文件中。
以下脚本应在git存储库中执行。除非您取消回显git tag命令,否则它将不会在存储库中进行任何修改。

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

请注意,映射文件来自this comment

在某些特定条件下(我不知道),lfs migrate import无法将引用(标记,分支)从旧提交移至新创建的提交。
因此,“ git gc”无法删除旧的提交。
不幸的是,我们的数据库不可共享,但是我可以尝试描述摆脱这些旧提交的方法。

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

答案 1 :(得分:1)

借助@torek的评论,我设法弄清楚了。如上面的评论中所述,ssl列出了正确的提交次数。

该存储库是通过使用git tfs将TFVC存储库转换为git创建的。运行git rev-list --branches --tagsgit for-each-ref下列出了一堆引用,但由于运行refs/remotes/tfs列为 commits 而没有显示。因此,可能这些引用了git remote -v未重写的一堆旧提交,并且显然git lfs不会像预期的那样迁移ref。

使用git lfs migrate删除所有这些引用,然后执行另一个gc似乎已解决了该问题,并且存储库已恢复为原始提交数量。