首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在文件夹模式上使用git过滤器分支

如何在文件夹模式上使用git过滤器分支
EN

Stack Overflow用户
提问于 2019-08-22 19:58:36
回答 2查看 874关注 0票数 3

我已经向我的本地回购提交了一堆敏感数据,但这些数据还没有发布。

敏感数据分散在项目的不同文件夹中,我希望将所有这些数据从git历史记录中完全删除。

所有相关文件夹都具有相同的名称,并且在不同文件夹的目录中处于相同的级别。以下是我的文件夹结构的示例:

代码语言:javascript
复制
root
    folder1
           ./sensitiveData
    folder2
           ./sensitiveData
    folder3
           ./sensitiveData

使用以下命令,我可以一次删除包含敏感数据的文件夹:

代码语言:javascript
复制
git filter-branch -f --index-filter 'git rm -r --cached --ignore-unmatch javascript/folder1/.sensitiveData' --prune-empty HEAD

但是我想一次删除所有包含敏感数据的文件夹,因为它们太多了,我想了解它是如何工作的。

但是,使用以下命令,将不会重写任何内容,并警告我,'refs/heads/master' is unchanged没有更改:

代码语言:javascript
复制
git filter-branch -f --index-filter 'git rm -r --cached --ignore-unmatch javascript/*/.sensitiveData' --prune-empty HEAD

在我看来,有两种策略:

  1. 要么我的模式是错误的,我需要改变它。
  2. 或者我应该和bash做个循环。

如果可能的话,第一种选择似乎更明智。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-08-23 14:32:39

最后,解决我的问题的是使用for in构造的一个小型bash脚本。

代码语言:javascript
复制
for name in javascript/*/.sensitiveData
    do git filter-branch -f --index-filter "git rm -r --cached --ignore-unmatch $name" --prune-empty HEAD
done
票数 -1
EN

Stack Overflow用户

发布于 2019-08-22 20:51:14

运行命令时,首先由shell计算命令。因此,在以下方面:

代码语言:javascript
复制
'git rm -r --cached --ignore-unmatch javascript/*/.sensitiveData'

单引号保护整个事件不受shell的影响,并将其作为git filter-branch传递给--index-filter,以便稍后使用。单引号在这一点上消失了。

问题是:提供给git filter-branch的过滤器在过滤时由另一个shell (从技术上讲,运行git filter-branch本身的shell )进行评估。另一个shell eval的命令是:

代码语言:javascript
复制
eval $filter

现在,第二个shell重新解释:

代码语言:javascript
复制
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

您可以使用以下方法将一些变量从该方程中删除:

代码语言:javascript
复制
'git rm -r --cached --ignore-unmatch javascript/\*/.sensitiveData'

因此,第二个外壳可以看到:

代码语言:javascript
复制
git rm -r --cached --ignore-unmatch javascript/\*/.sensitiveData

这将迫使第二个外壳通过:

代码语言:javascript
复制
javascript/*/.sensitiveData

直接到git rm。但是,考虑到这可能无论如何都会起作用,检查javascript/*/.sensitiveData是否与特定提交中的正确文件匹配是有意义的,您可以在提交时笨拙地/手动地使用git ls-tree -r

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57616303

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档