场景如下:
我有一个大的CVS代码库,想将其转换为14个不同的git代码库。cvs2git部分处理得很好,并导致了一个名为repo.git的大型代码库。
对于14个git代码库中的每一个,我克隆主代码库,并运行以下命令:
在整个过程结束后(约14500个提交:需要约1小时!),我会清理引用并使用
最终,我得到了一个1.2Go的存储库 (这显然还是太大了),通过查看提交记录,我可以看到许多旧的提交记录仍然存在。它们涉及文件和目录,在执行
在提交记录历史中,如
我非常确定这些提交记录之所以仍然存在,是因为其中一些标签。如果是这种情况,是否有可能删除那些标签而不会移除好的提交上的标签?
如果标签不是原因,有什么想法吗?
更多信息,通过subdirectory-filter获得的git存储库中
我有一个大的CVS代码库,想将其转换为14个不同的git代码库。cvs2git部分处理得很好,并导致了一个名为repo.git的大型代码库。
对于14个git代码库中的每一个,我克隆主代码库,并运行以下命令:
git filter-branch -d /tmp/rep --tag-name-filter cat --prune-empty --subdirectory-filter "sub/directory" -- --all
不过,在执行这个命令之前,我需要先对一些git存储库执行另一个git filter-branch
命令,因为我需要重写提交记录以将一个文件从一个目录移动到另一个目录。我使用的选项是--tree-filter
。下面是执行的命令行示例:
script_tree_filter="if test -f rep/to/my/file && test -d another/rep ; then echo Moving my file ; mv rep/to/my/file another/rep; fi"
git filter-branch -d /tmp/rep --tag-name-filter cat --prune-empty --tree-filter '$script_tree_filter' -- --all
在整个过程结束后(约14500个提交:需要约1小时!),我会清理引用并使用
git gc
命令:git for-each-ref --format="%(refname)" refs/original/ | xargs -n 1 git update-ref -d
git reflog expire --expire=now --all
git gc --prune=now
最终,我得到了一个1.2Go的存储库 (这显然还是太大了),通过查看提交记录,我可以看到许多旧的提交记录仍然存在。它们涉及文件和目录,在执行
--subdirectory-filter
命令后不应该再存在于这里。在提交记录历史中,如
gitk --all
所示,存在不良提交和好的提交之间的不连续性:
![discontinuity seen in gitk](https://istack.dev59.com/JP1FP.webp)
如果标签不是原因,有什么想法吗?
更多信息,通过subdirectory-filter获得的git存储库中
refs
目录的内容为空:$ ls -R refs/
refs/:
heads original tags
refs/heads:
refs/original:
refs
refs/original/refs:
heads tags
refs/original/refs/heads:
refs/original/refs/tags:
refs/tags:
我发现在 git 仓库中,分支和标签都列在文件 packed-refs
中:
d0c675d8f198ce08bb68f368b6ca83b5fea70a2b refs/tags/v03-rev-04
95c3f91a4e92e9bd11573ff4bb8ed4b61448d8f7 refs/tags/v03-rev-05
该文件中列出了817个标签和219个分支。
git gc
将标签引用打包到 .git/packed-refs 中,因此出现了空目录。但是我不确定为什么标签会指向旧的提交,因为每个 filter-branch 操作都使用了--tag-name-filter
。 - torekreset hard
,我已经按照我的问题中提到的三个命令执行了(由于我有裸库,rm -rf .git/refs/original/
的写法不同)。我没有使用gc的--aggressive
选项,但我无法尝试(我认为这不会改变任何东西)。 - Frodonls
日志不是最新的,对吧?里面有refs/original
的东西。另外,请在你的评论中使用 @user ,否则我们不会收到通知。 - CharlesBpacked-refs
文件中是否有refs/original
的内容?如果有,请将其从文件中删除,然后重新运行git-gc。 - CharlesB