当所有大文件(或所有二进制文件)已经在 git 存储库中时,将其导入 git 附件的最佳方法是什么?
我不想丢失所有的提交,所以我认为创建一个新的 repo 并在那里初始化附件、导入所有文件然后提交并不是一个好主意。
我还考虑过以下做法:复制存储库,然后删除 git 中的所有二进制文件,然后再次导入并添加到附件中。如果存在多个分支和大量二进制内容,这将是一项艰巨的工作。
答案1
如果您只是从最近的提交中删除文件并立即开始使用 git-annex,它将起作用,但您现有的 git 存储库不会变小。这是因为您的历史记录仍然包含签入 Git 的所有大文件。
您可能能够使用git-filter-branch
重写提交来删除大文件并附加它们,就好像它们一直在那里一样。该命令可能类似于以下内容。由于我没有安装 git-annex,所以我自己还没有测试过这个,所以你应该先克隆你的 repo 并在那里测试它!
git filter-branch --tree-filter 'find . -size +5M -type f -not -ipath \*.git/\* -print0 | xargs -0 git rm --cached;find . -size +5M -type f -not -ipath \*.git/\* -print0 | xargs -0 git annex add' HEAD
一步一步来,我们希望实现的目标是:
git filter-branch --tree-filter '<commands>' HEAD
重写从 HEAD 可到达的所有提交的树。
find . -size +5M -type f -not -ipath \*.git/\* -print0 | xargs -0 git rm --cached;
对于每次提交,找到 repo 中所有大于 5MB 的文件(减去 .git 目录)并将其从索引中删除。
find . -size +5M -type f -not -ipath \*.git/\* -print0 | xargs -0 git annex add
查找 repo 中所有大于 5MB 的文件,并添加到附件中
答案2
git-annex 页面上已提到过一些这一点: http://git-annex.branchable.com/forum/migrate_existing_git_repository_to_git-annex/
我的经历没那么复杂,我不需要编辑 .gitattributes,因此也不需要在前端进行大量 rebase。我也只有一个分支。
git filter-branch --tag-name-filter cat --tree-filter 'mkdir -p .git-annex; cp ${MYWORKDIR}/.tmp/* .git-annex/; find . -size +5M -type f -not -ipath \*.git\* -not -ipath \*.temp\* -print0 | parallel -0 -j1 ~/bin/gax; git reset HEAD .git-rewrite; :' -- master
GNU parallel 调用的脚本:~/bin/gax 如下所示:
#!/bin/bash
f=$1;
git annex add ${f};
annexdest=$(readlink ${f});
ln -sf ${annexdest#../../} ${f};
通过一次传递所有文件,可以加快脚本的速度(git annex 忽略不存在的文件的添加),但您必须循环遍历符号链接部分才能修复所有文件。
通过首先使用 find 生成文件列表,然后使用该列表而不是每次在工作树上运行 find,也可以加快 filter-branch 命令的速度。
答案3
我遇到了类似的问题,但我不需要处理多个分支或仅处理超过一定大小的特定文件,而是需要处理 3 个子目录中的每个文件。
我的主要问题是,由于某种原因,find 命令无法在子目录下工作。
我根据@Rufflewind 的建议尝试这样做:
git filter-branch --tree-filter 'find gapps* -not -ipath \*.git/\* -type f -execdir git rm --cached {} + -execdir git annex add -- {} +' HEAD
这没有起作用,经过多次尝试后,我想到了这个:
git filter-branch --tree-filter 'find ~/Documents/Git/vox_gapps/gapps -type f -execdir git rm --cached {} + -execdir git annex add -- {} +' HEAD
因此,如果您遇到问题,请尝试输入完整路径而不是绝对路径。