我已经向我的本地回购提交了一堆敏感数据,但这些数据还没有发布。
敏感数据分散在项目的不同文件夹中,我希望将所有这些数据从git历史记录中完全删除。
所有相关文件夹都具有相同的名称,并且在不同文件夹的目录中处于相同的级别。以下是我的文件夹结构的示例:
root
folder1
./sensitiveData
folder2
./sensitiveData
folder3
./sensitiveData使用以下命令,我可以一次删除包含敏感数据的文件夹:
git filter-branch -f --index-filter 'git rm -r --cached --ignore-unmatch javascript/folder1/.sensitiveData' --prune-empty HEAD但是我想一次删除所有包含敏感数据的文件夹,因为它们太多了,我想了解它是如何工作的。
但是,使用以下命令,将不会重写任何内容,并警告我,'refs/heads/master' is unchanged没有更改:
git filter-branch -f --index-filter 'git rm -r --cached --ignore-unmatch javascript/*/.sensitiveData' --prune-empty HEAD在我看来,有两种策略:
如果可能的话,第一种选择似乎更明智。
发布于 2019-08-23 14:32:39
最后,解决我的问题的是使用for in构造的一个小型bash脚本。
for name in javascript/*/.sensitiveData
do git filter-branch -f --index-filter "git rm -r --cached --ignore-unmatch $name" --prune-empty HEAD
done发布于 2019-08-22 20:51:14
运行命令时,首先由shell计算命令。因此,在以下方面:
'git rm -r --cached --ignore-unmatch javascript/*/.sensitiveData'单引号保护整个事件不受shell的影响,并将其作为git filter-branch传递给--index-filter,以便稍后使用。单引号在这一点上消失了。
问题是:提供给git filter-branch的过滤器在过滤时由另一个shell (从技术上讲,运行git filter-branch本身的shell )进行评估。另一个shell eval的命令是:
eval $filter现在,第二个shell重新解释:
git rm -r --cached --ignore-unmatch javascript/*/.sensitiveData它分解空格中的参数,根据当前工作目录展开星号,并对展开结果调用git rm -r --cached --ignore-unmatched。
如果扩张成功,就会发生一件事;如果不成功,就会发生其他事情。确切地说,发生什么取决于shell (bash可以配置为几种不同的行为方式;POSIX sh更可预测)。
--index-filter的实际当前工作目录通常是空的,因此扩展可能会失败。在大多数情况下,这应该将星号不变地传递给Git。由于git rm的参数(大部分/本质上)是路径规范,Git现在将进行自己的扩展。这应该是有效的,所以路径本身是错误的,或者目录不是空的,或者您的shell有一些奇怪的地方,因此失败的展开没有将文字文本javascript/*/.sensitiveData传递给git rm。
您可以使用以下方法将一些变量从该方程中删除:
'git rm -r --cached --ignore-unmatch javascript/\*/.sensitiveData'因此,第二个外壳可以看到:
git rm -r --cached --ignore-unmatch javascript/\*/.sensitiveData这将迫使第二个外壳通过:
javascript/*/.sensitiveData直接到git rm。但是,考虑到这可能无论如何都会起作用,检查javascript/*/.sensitiveData是否与特定提交中的正确文件匹配是有意义的,您可以在提交时笨拙地/手动地使用git ls-tree -r。
https://stackoverflow.com/questions/57616303
复制相似问题