Git --chmod不使用索引筛选器

Git --chmod不使用索引筛选器,git,git-bash,git-filter-branch,git-rewrite-history,Git,Git Bash,Git Filter Branch,Git Rewrite History,我想使用筛选器分支将所有文件设置为非可执行文件,因为大多数用户使用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

我想使用筛选器分支将所有文件设置为非可执行文件,因为大多数用户使用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过滤器与chmod一起使用(至少这对我不起作用)。当我使用--filter tree而不是--filter index时,它是有效的,但我尝试使用--filter index,因为它应该快得多。

虽然你的问题集中在
git filter branch
来进行重写,但还是值得考虑使用BFG,尽管它不是现成的,添加一个
TreeBlobs
清理器,将所有文件设置为不可执行文件,这是一个非常小的调整:

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

使用上面的
non-executable
分支,您可以在不使用任何额外命令行开关的情况下运行BFG,因为cleaner是硬连线的(遵循BFG的所有步骤,这只是核心位):

这将比任何大型存储库上的
git filter branch
(带或不带
--filter index
)执行速度快几百倍-例如,我在linux内核项目(~500k提交)上测试了这个自定义清理器,它在5分钟内完成


全面披露:我是BFG回购清理器的作者。

我认为每次提交时都不断更改树是非常低效的,因为在大多数情况下,每次提交都是同一棵树。我还需要删除错误的行结尾,以便将以\r\n或\n\r结尾的任何行更改为\n。我假设你的工具也能做到这一点?是否有BFG的完整使用说明?我似乎只在用法页面上找到了示例,但没有找到所有选项的实际说明。有关如何将Windows新行替换为Unix新行的信息,请参阅我的答案:。另外,有关使用选项的更多详细信息,只需运行BFG而不提供任何参数-它将列出所有选项,并对每个选项进行简短描述。我在尝试构建
[error](BFG/*:gitDescription)java.io.IOException:无法运行程序“git”:CreateProcess error=2,系统找不到指定的文件
。可以为您创建的分支提供一个jar吗?有了新的Windows修复程序,我在编译时没有问题。我能够为一个在不到10分钟内提交了9000多次的存储库清除坏的换行符和可执行位。我甚至不想去想git过滤器分支需要多长时间。
$ java -jar bfg-custom.jar my-repo.git