如何使用 BFG 从 git 历史记录中永久删除文件夹
How to delete folder from git history permanently using BFG
我正在使用 BFG 删除我的两个文件夹。他们从回购开始就被追踪。删除的原因是那些文件夹包含我们不再需要的二进制文件和其他 txt 文件。但是当我尝试删除这两个文件夹时,一个被删除但另一个仍然存在。
我创建了虚拟存储库并做了一些提交以重现问题。
我假设 myRepo.git 是干净的回购协议。
我用来删除文件夹的功能是:
java -jar bfg-1.13.0.jar --no-blob-protection --delete-folders "{system1, system2}" myRepo.git
#!/bin/bash
BUILD(){
git clone https://github.com/xxxx/myRepo.git
cd myRepo
echo "Jpt test1" > jpt1.txt
echo "Jpt test2" > jpt2.txt
echo "Jpt test3" > jpt3.txt
git add jpt1.txt jpt2.txt jpt3.txt
git commit -m "first commit"
git push origin master
######
mkdir system1
cd system1
mkfile 14m outputfile1.out
mkfile 14m outputfile2.out
echo "Jpt test1" > sysjpt1.txt
echo "Jpt test2" > sysjpt2.txt
echo "Jpt test3" > sysjpt3.txt
cd ..
######
mkdir system2
cd system2
mkfile 14m outputfile1.out
mkfile 14m outputfile2.out
cd ..
git add system1 system2
git commit -m "tracking large file"
git push origin master
cd ..
##### Call function BFG which does BFG stuff.
BFG
}
BFG(){
# run bfg and let git clean history
git clone --mirror https://github.com/xxxx/myRepo.git
java -jar bfg-1.13.0.jar --no-blob-protection --delete-folders "{system1, system2}" myRepo.git
cd myRepo.git
git reflog expire --expire=now --all && git gc --prune=now --aggressive
git push
cd ..
mkdir test_new
cd test_new
git clone https://github.com/xxx/myRepo.git
cd myRepo
ls
}
BUILD
当我在清洁后克隆并对其执行 ls
时。我得到
jpt1.txt jpt2.txt jpt3.txt system2
。看看system2文件夹怎么还在。
正如您根据我在上面评论中的建议所测试的那样,问题出在 "{system1, system2}"
中的 space。处理该表达式时,它会将其扩展为 "system1"
和 " system2",
,并在 system2,
前面加上 space,这不是您想要的。
您可以 运行 两个命令中的过程,一次使用 system1
一次使用 system2,
或简单地删除 space,一切都会起作用。
有趣的是,{a,b}
的扩展似乎是由 bfg 本身完成的,而不是由 bash 完成的:引号告诉 bash 按字面意思传递该字符串,所以尽管这看起来像bash 语法实际上不是 bash 扩展。
我正在使用 BFG 删除我的两个文件夹。他们从回购开始就被追踪。删除的原因是那些文件夹包含我们不再需要的二进制文件和其他 txt 文件。但是当我尝试删除这两个文件夹时,一个被删除但另一个仍然存在。
我创建了虚拟存储库并做了一些提交以重现问题。 我假设 myRepo.git 是干净的回购协议。
我用来删除文件夹的功能是:
java -jar bfg-1.13.0.jar --no-blob-protection --delete-folders "{system1, system2}" myRepo.git
#!/bin/bash
BUILD(){
git clone https://github.com/xxxx/myRepo.git
cd myRepo
echo "Jpt test1" > jpt1.txt
echo "Jpt test2" > jpt2.txt
echo "Jpt test3" > jpt3.txt
git add jpt1.txt jpt2.txt jpt3.txt
git commit -m "first commit"
git push origin master
######
mkdir system1
cd system1
mkfile 14m outputfile1.out
mkfile 14m outputfile2.out
echo "Jpt test1" > sysjpt1.txt
echo "Jpt test2" > sysjpt2.txt
echo "Jpt test3" > sysjpt3.txt
cd ..
######
mkdir system2
cd system2
mkfile 14m outputfile1.out
mkfile 14m outputfile2.out
cd ..
git add system1 system2
git commit -m "tracking large file"
git push origin master
cd ..
##### Call function BFG which does BFG stuff.
BFG
}
BFG(){
# run bfg and let git clean history
git clone --mirror https://github.com/xxxx/myRepo.git
java -jar bfg-1.13.0.jar --no-blob-protection --delete-folders "{system1, system2}" myRepo.git
cd myRepo.git
git reflog expire --expire=now --all && git gc --prune=now --aggressive
git push
cd ..
mkdir test_new
cd test_new
git clone https://github.com/xxx/myRepo.git
cd myRepo
ls
}
BUILD
当我在清洁后克隆并对其执行 ls
时。我得到
jpt1.txt jpt2.txt jpt3.txt system2
。看看system2文件夹怎么还在。
正如您根据我在上面评论中的建议所测试的那样,问题出在 "{system1, system2}"
中的 space。处理该表达式时,它会将其扩展为 "system1"
和 " system2",
,并在 system2,
前面加上 space,这不是您想要的。
您可以 运行 两个命令中的过程,一次使用 system1
一次使用 system2,
或简单地删除 space,一切都会起作用。
有趣的是,{a,b}
的扩展似乎是由 bfg 本身完成的,而不是由 bash 完成的:引号告诉 bash 按字面意思传递该字符串,所以尽管这看起来像bash 语法实际上不是 bash 扩展。