首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >理解为什么git过滤器分支没有清理我的历史记录

理解为什么git过滤器分支没有清理我的历史记录
EN

Stack Overflow用户
提问于 2019-10-23 23:57:29
回答 3查看 375关注 0票数 1

我用泄密来检查我的回购记录中泄露的秘密。当我运行以下命令并强制推送时

代码语言:javascript
复制
git filter-branch --force --index-filter \
  'git rm -r --cached --ignore-unmatch terra/fixtures.go' \
  --prune-empty --tag-name-filter cat -- --all

这似乎很有效,但我注意到以下几点:

代码语言:javascript
复制
WARNING: Ref 'refs/heads/automate_tests' is unchanged
WARNING: Ref 'refs/heads/ethRawTransaction' is unchanged
WARNING: Ref 'refs/heads/feature/177/leave-bastion' is unchanged
WARNING: Ref 'refs/heads/feature/FAQ' is unchanged
WARNING: Ref 'refs/heads/master' is unchanged
WARNING: Ref 'refs/heads/mjolnir' is unchanged
WARNING: Ref 'refs/heads/tmp' is unchanged
WARNING: Ref 'refs/remotes/origin/master' is unchanged
WARNING: Ref 'refs/remotes/origin/automate_tests' is unchanged
WARNING: Ref 'refs/remotes/origin/bug/0.0.11-beta-fix' is unchanged
WARNING: Ref 'refs/remotes/origin/bug/bastion-ssh' is unchanged
WARNING: Ref 'refs/remotes/origin/bug/fix-examples-merge' is unchanged
WARNING: Ref 'refs/remotes/origin/develop' is unchanged
WARNING: Ref 'refs/remotes/origin/ethRawTransaction' is unchanged
WARNING: Ref 'refs/remotes/origin/feature/168/auto-ssh-to-bastion' is unchanged
WARNING: Ref 'refs/remotes/origin/feature/169/ethstats_for_pantheon' is unchanged
WARNING: Ref 'refs/remotes/origin/feature/175/ssh-to-certain-nodes' is unchanged
WARNING: Ref 'refs/remotes/origin/feature/176/tagging-nodes-to-ips' is unchanged
WARNING: Ref 'refs/remotes/origin/feature/177/leave-bastion' is unchanged
WARNING: Ref 'refs/remotes/origin/feature/FAQ' is unchanged
WARNING: Ref 'refs/remotes/origin/feature/README' is unchanged
WARNING: Ref 'refs/remotes/origin/master' is unchanged
WARNING: Ref 'refs/remotes/origin/mjolnir' is unchanged
WARNING: Ref 'refs/remotes/origin/tmp' is unchanged
WARNING: Ref 'refs/tags/0.0.4' is unchanged
WARNING: Ref 'refs/tags/20190820141131-866368a' is unchanged
WARNING: Ref 'refs/tags/20190820142202-bd96767' is unchanged
WARNING: Ref 'refs/tags/20190820143451-fc7f46a' is unchanged
WARNING: Ref 'refs/tags/20190820143903-832818a' is unchanged
WARNING: Ref 'refs/tags/20190820150546-05e3105' is unchanged
WARNING: Ref 'refs/tags/20190820154631-da0cdab' is unchanged
WARNING: Ref 'refs/tags/20190820160956-047caa6' is unchanged
WARNING: Ref 'refs/tags/20190820162243-a300fa5' is unchanged
WARNING: Ref 'refs/tags/20190820170410-47f8878' is unchanged
WARNING: Ref 'refs/tags/untagged-f148f02c4d71ed0bea99' is unchanged
WARNING: Ref 'refs/tags/v.0.0.1' is unchanged
WARNING: Ref 'refs/tags/v0.0.1' is unchanged
WARNING: Ref 'refs/tags/v0.0.1-alpha' is unchanged
WARNING: Ref 'refs/tags/v0.0.10' is unchanged
WARNING: Ref 'refs/tags/v0.0.11-beta' is unchanged
WARNING: Ref 'refs/tags/v0.0.14' is unchanged
WARNING: Ref 'refs/tags/v0.0.3-alpha' is unchanged
WARNING: Ref 'refs/tags/v0.0.4-chaos-poc' is unchanged

因此,泄漏的数量似乎并没有下降。

我对为什么会发生这种情况感到困惑,并希望得到任何建议。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-10-24 04:43:11

git filter-branch报告为未更改的参考文件在其历史记录中的任何地方都没有一个名为terra/fixtures.go的文件。Filter-分支通知您,虽然您要求它更新这些分支名称以指向任何复制的提交,但实际上没有在进程中复制提交。

可能很有趣的是找到一个具有这样一个文件的可访问提交哈希It的列表,然后对这样的散列It运行git branch --contains。见下文。

哪个提交包含文件F?

请注意,对于不同的问题,这是一个不同的答案。它也不是寻找某个路径名被修改的提交,而是寻找存在某个路径名的提交。

我们首先使用git rev-list列出所有提交:

代码语言:javascript
复制
git rev-list --all |

git rev-list的输出只是每个提交散列ID的列表,每个提交哈希ID都可以从命名的修订中获得。在本例中,--all与其他参考文献(如refs/stash )一起命名所有分支和标记,但不命名任何reflog条目。

然后,对于列出的每个提交,我们希望测试这个提交是否包含指定的文件。此时,您通常需要大量的可编程性。例如,假设文件名为a/b/c.txt。你也想找到A/B/C.TXT吗?如果你在Windows或MacOS上,你可能会。如果您使用的是Linux,可能不会。或者,您可能希望找到名称以某种模式开头或结尾的任何文件。

我们在这里要做的是使用git ls-tree -r,它列出所有的文件名,然后通过搜索和状态命令(如grep )运行它们。请注意,grep搜索正则表达式,而不是glob模式,因此a*b表示零或多个a字符,后面跟着一个b字符,并将匹配字符串"abc.txt“、"b”、"flobby“等:这些字符串都有零或多个a,后面跟着一个b。我们将让实际匹配的名称显示出来,这样如果需要的话,人类可以应用进一步的过滤:

代码语言:javascript
复制
git rev-list --all |
    while read hash; do
        git ls-tree -r $hash > /tmp/files
        if grep -s 'terra/fixtures\.go' /tmp/files; then
            echo "commit ${hash} :"
            grep 'terra/fixtures\.go' /tmp/files
        fi
    done
rm /tmp/files

这组命令的输出--您可能应该将这些命令放在文件中,并且我还没有测试,并且可能包含错误--是一组适合提取的提交散列is,但后面也跟着匹配的名称:您可能应该放弃匹配的sputerra/fixtures.gobble

(可以编写更符合实际的grep模式。在这种情况下,用^$锚定正则表达式就足够了。在更复杂的情况下,需要更复杂的正则表达式。我把这个留给使用代码的人。)

获得散列ID之后--运行上面的代码并重定向到一个文件,清理文件,然后提取更有趣的散列IDs-然后您可以这样做:

代码语言:javascript
复制
git branch --contains <hash>

在任何给定的提交散列上,查看哪些分支包含该特定提交。请注意,可能有零个或多个包含任何给定提交的分支。有关这方面的更多信息,请阅读并理解想(a) Git

票数 1
EN

Stack Overflow用户

发布于 2019-10-24 04:36:04

尝试使用git filter-repo,其中的或BFG

代码语言:javascript
复制
git filter-repo --use-base-name --path terra/fixtures.go --invert-paths

默认情况下,此新命令适用于所有分支。然后是一个git push --all --force,以覆盖远程存储库的历史记录。

票数 1
EN

Stack Overflow用户

发布于 2019-10-24 01:07:41

试着用双引号

代码语言:javascript
复制
git filter-branch --force --index-filter \
  "git rm -r --cached --ignore-unmatch 'terra/fixtures.go'" \
  --prune-empty --tag-name-filter cat -- --all
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58532378

复制
相关文章

相似问题

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