场景如下:
我有一个大型 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 小时!)我清理了 refs 并使用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
:
我很确定这些提交仍然存在,因为它们上有一些标签。如果是这种情况,是否可以在不删除良好提交的情况下删除这些标签?
如果标签不是原因,有什么想法吗?
更多信息,refs
目录的内容(在 subdirectory-filter 获取的 git 仓库中)为空:
$ 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:
我发现分支和标签列在packed-refs
git 存储库的文件中:
d0c675d8f198ce08bb68f368b6ca83b5fea70a2b refs/tags/v03-rev-04
95c3f91a4e92e9bd11573ff4bb8ed4b61448d8f7 refs/tags/v03-rev-05
文件中列出了 817 个标签和 219 个分支。