gpt4 book ai didi

git - 从历史记录中删除不需要的文件,包括所有带有过滤器分支的引用

转载 作者:太空狗 更新时间:2023-10-29 13:51:58 25 4
gpt4 key购买 nike

我最近克隆了一个 SVN 存储库,它曾经有一些二进制文件,现在不再需要了。不幸的是,我已经将它与包含的二进制文件一起推送到 Github。我现在想使用“git filter-branch”删除这些,但在涉及标签和分支时我遇到了一些问题。

基本上,我创建了一个简单的 shell 脚本来删除由以下命令确定的文件列表:

git rev-list --objects --all | grep .jar > files.txt

删除脚本如下所示:

#!/bin/sh
while read file_hash file_to_remove
do
echo "Removing "$file_to_remove;
git filter-branch --index-filter "git rm --cached --ignore-unmatch $file_to_remove"
rm -rf .git/refs/original/;
git reflog expire --all --expire-unreachable=0;
git repack -A -d;
git prune
done < $1

我有几个标签(都在 .git/packed-refs 中列出),一个 .git/refs/remotes/origin(指向 Github 存储库)。使用上述脚本删除文件没有达到预期效果('du -cm' 仍然输出相同的大小;'git rev-list' 仍然列出文件)直到我手动从 .git/packed 中删除所有引用-refs 和 .git/refs/remotes/origin 目录。

自然地,我将丢失所有标签以及使用此方法将我的本地更改推送回 Github 的可能性。有什么我遗漏的吗?或者有没有其他方法可以在不破坏我的历史记录的情况下从所有分支/标签中删除文件?

非常感谢,马修斯

最佳答案

我最终使用了 BFG Repo Cleaner在裸克隆存储库 (git clone --mirror repo-url) 上。它遍历每个分支/标签,让每个分支都工作,它甚至比 filter-branch 快得多。希望这可以帮助其他遇到类似问题的人。

这是我的封装脚本:

#!/bin/bash
#usage: ./remove_files.sh file_list.txt bare-repo-dir
while read file_hash file_to_remove
do
echo "Removing "$file_to_remove;
lastFile=`echo $file_to_remove | awk -F/ '{print $NF}'`;
java -jar bfg.jar --delete-files $lastFile $2;
done < $1

cd $2;
git gc --prune=now --aggressive;
cd ..;

关于git - 从历史记录中删除不需要的文件,包括所有带有过滤器分支的引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15759198/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com