--chmod 不适用于索引过滤器

--chmod not working with index-filter

我想使用 filter-b运行ch 将所有文件设置为不可执行,因为大多数用户使用 Windows。我在 运行 Git Bash 中执行以下命令:

git filter-branch --index-filter 'for file in $(git ls-files)
do
  git update-index --chmod=-x -- $file
done' -- HEAD~1..HEAD

但是,我收到一条错误消息:

Rewrite bc4368aec16cce1c1faa7363dde9ac74ac28da6a (1/1)
error: .gitignore: does not exist and --remove not passed
fatal: Unable to process path .gitignore
error: LICENSE.md: does not exist and --remove not passed
fatal: Unable to process path LICENSE.md
error: README.md: does not exist and --remove not passed
fatal: Unable to process path README.md

因为我在 Windows,我什至无法将 --tree-filter 与 chmod 一起使用(至少这对我不起作用)。当我使用 --filter-tree 而不是 --filter-index 时它起作用了,但我正在尝试使用 --filter-index 因为它应该更快。

尽管您的问题侧重于 git filter-branch 进行重写,但值得考虑使用 BFG - 虽然它不是开箱即用的,但添加 [=12] 是一个非常小的调整=] 将所有文件设置为不可执行的清理器:

https://github.com/rtyley/bfg-repo-cleaner/compare/non-executable

您可以非常轻松地构建自定义版本的 BFG:

https://github.com/rtyley/bfg-repo-cleaner/blob/master/BUILD.md

使用上面的 non-executable 分支,您可以 运行 BFG 而无需任何额外的命令行开关,因为清洁器是硬连线的(遵循 BFG 的所有 usage instructions , 这只是核心位):

$ java -jar bfg-custom.jar my-repo.git

这将在任何大型存储库上执行比 git filter-branch(有或没有 --filter-index)快几百倍 - 例如,我在linux-kernel 项目(~500k 提交),在 5 分钟内完成。

完全披露:我是 BFG Repo-Cleaner 的作者。