我尝试在大型存储库上运行git lfs migrate import --everything --include="*.dll"
。在我运行之前,大约进行了7万次提交。在运行迁移(并且过期reflog和修剪等)之后,git rev-list --all --count
显示大约13万次提交。为什么添加了这么多提交,这些提交是什么?
答案 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
”无法删除旧的提交。
不幸的是,我们的数据库不可共享,但是我可以尝试描述摆脱这些旧提交的方法。
- 在运行
--object-map=
时创建一个映射文件(lfs migrate import
),以获取lfs创建的旧提交和新提交之间的关联。- 从原始数据库和有效的lfs数据库(
git rev-list –all
)中收集所有提交- 识别所有所谓的两次提交。这些是原始的lfs数据库中存在的提交。
- 检查这些双重提交是否仍存在引用(
git show –s
),并使用以下git命令手动或通过脚本将每个找到的引用移动到相应的新提交(来自创建的映射文件):git tag –f
,git update-ref
。- 运行
git gc –prune=now
并在工作的lfs数据库中检查提交计数
答案 1 :(得分:1)
借助@torek的评论,我设法弄清楚了。如上面的评论中所述,ssl
列出了正确的提交次数。
该存储库是通过使用git tfs将TFVC存储库转换为git创建的。运行git rev-list --branches --tags
在git for-each-ref
下列出了一堆引用,但由于运行refs/remotes/tfs
列为 commits 而没有显示。因此,可能这些引用了git remote -v
未重写的一堆旧提交,并且显然git lfs不会像预期的那样迁移ref。
使用git lfs migrate
删除所有这些引用,然后执行另一个gc似乎已解决了该问题,并且存储库已恢复为原始提交数量。