我们将客户迁移到网站上。我们的代码在一个单独的分支上,然后合并到主分支和发布分支中。自那时以来,主分支已经多次分支出其他功能。所有这些分支使得存储库比我在网上找到的示例稍微复杂一些。
现在我们意识到,客户的原始媒体 - 主要是图像和一个大的CSV文件 - 也被检入了Git。虽然只有12MB左右,但有几个原因需要删除它(最重要的是,客户的文件名具有非ASCII字符,在OSX上使用Vagrant虚拟机的共享文件夹时会遇到问题)。以下是存储库的大小统计:
尽管这些二进制文件显然现在已经出现在几个分支上,但据我所知,我应该能够只需执行以下操作即可删除这两个二进制文件,以及与之对应的存储库对象:
最大的文件是.git/objects/pack/pack-....pack。当我验证这个文件的.idx文件时:
现在我们意识到,客户的原始媒体 - 主要是图像和一个大的CSV文件 - 也被检入了Git。虽然只有12MB左右,但有几个原因需要删除它(最重要的是,客户的文件名具有非ASCII字符,在OSX上使用Vagrant虚拟机的共享文件夹时会遇到问题)。以下是存储库的大小统计:
$ du --max-depth 1 -h
12M ./.git
13M ./modules
2.0M ./themes
27M .
尽管这些二进制文件显然现在已经出现在几个分支上,但据我所知,我应该能够只需执行以下操作即可删除这两个二进制文件,以及与之对应的存储库对象:
$ git filter-branch --tree-filter "git rm -rf --ignore-unmatch modules/custom/mymigration/data/photos/*" # Did this with and without "HEAD" argument
[snip lots of output]
$ git reflog expire --expire=now --all
$ git gc --aggressive --prune=now
然而,我仍然有一个较大的 .git 子文件夹:
$ du --max-depth 1 -h
12M ./.git
1.4M ./modules
2.0M ./themes
15M .
最大的文件是.git/objects/pack/pack-....pack。当我验证这个文件的.idx文件时:
$ git verify-pack -v .git/objects/pack/pack-53c8077d0590dabcf5366589c3d6594768637f5e.idx | sort -k 3 -n | tail -n 5
我得到了一个很长的对象列表。如果我将其传递给rev-list,并在其中搜索我的迁移数据目录:
$ for i in `git verify-pack -v .git/objects/pack/pack-53c8077d0590dabcf5366589c3d6594768637f5e.idx | sort -k 3 -n | tail -n 5 | awk '{print $1}'`; do
git rev-list --objects --all | \
grep $i | \
grep modules/custom/mymigration/data
done
47846536601f0bc3a31093c88768b522a5500c96 modules/custom/mymigration/data/photos/Turkey.jpg
b920e36357d855352f4fdb31c17772d21c01304d modules/custom/mymigration/data/photos/Burger_Top.JPG
那么,正如您所看到的,照片仍然在包文件中。
- 如果我将此存储库推送到(完全为空的)远程存储库中,然后在完全不同的位置克隆该远程存储库,则仍会有12MB的包文件。
- 使用
git clone file://path/to/old-repos new-repos
在本地克隆此存储库也会产生相同的影响:更糟糕的是,所有我的原始分支都会消失(正如您可能预期的那样),因此我只有主分支。
有没有办法摆脱这些打包对象?它们的存在是否表明它们仍与某个git提交对象相关联?我已经尝试过repack
和prune-packed
,但没有任何改变。
此外,如果我只是“摆脱它们”,如果我还没有正确地完成第一部分,是否会出现任何问题?如果删除了git提交仍然引用的文件对象会发生什么?