Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows 如何重写历史以删除git中的可执行位_Windows_Git_Executable_Git Filter Branch - Fatal编程技术网

Windows 如何重写历史以删除git中的可执行位

Windows 如何重写历史以删除git中的可执行位,windows,git,executable,git-filter-branch,Windows,Git,Executable,Git Filter Branch,我已经将一个相当大的存储库从另一个SCM导入git。不幸的是,迁移是在Windows上完成的(必须),每个文件都被提交到git中,并设置了执行位。为了避免再次进行迁移(这是一个很长且容易挂起的过程),我试图弄清楚是否可以清除服务器端的可执行位。我的想法是以某种方式将git过滤器分支与git更新索引结合使用,但我可以提供一些关于如何继续的提示 在最后执行大量提交清除所有可执行位并不是一个解决方案——我不希望每个文件在历史记录中都有起伏。这似乎可以解决问题: git过滤器分支--索引过滤器的git

我已经将一个相当大的存储库从另一个SCM导入git。不幸的是,迁移是在Windows上完成的(必须),每个文件都被提交到git中,并设置了执行位。为了避免再次进行迁移(这是一个很长且容易挂起的过程),我试图弄清楚是否可以清除服务器端的可执行位。我的想法是以某种方式将git过滤器分支与git更新索引结合使用,但我可以提供一些关于如何继续的提示


在最后执行大量提交清除所有可执行位并不是一个解决方案——我不希望每个文件在历史记录中都有起伏。

这似乎可以解决问题:

git过滤器分支--索引过滤器的git ls文件-s|
sed s/^100755/10644/|
git更新索引--index info'--all

您的解决方案非常好,但还有另一种可能性:
git config core.filemode false

core.fileMode

如果为false,则忽略索引和工作副本之间的可执行位差异;在FAT等损坏的文件系统上很有用。请参阅git更新索引(1)

默认值为true,但git clone(1)或git init(1)将在创建存储库时探测并将core.fileMode设置为false(如果适用)


这可能会为将来必须克隆回购协议的所有人创造更多的工作(或者可能不会,我不太确定),因此您的解决方案可能更好,但我想我会把它扔出去,因为它可能更适合其他人的用例…

这似乎起到了作用:git filter分支--索引过滤器'git ls files-s | sed s/^100755/10644/| git update index--索引信息'--所有你应该发布的答案,然后你就可以(自动)接受了。这似乎是一个很好的把戏,其他地方似乎没有记录。是的,但我在头八个小时里没能做到。有时我不明白这个游戏的规则所有规则都在那里:。在您的情况下:。一旦你点击了100次,你就被清除了。已经用可执行位签入的文件将不会得到帮助。无论如何,在签出时,它们将设置可执行位。不过,core.filemode=false本来可以防止这种情况发生。IMHO它应该是Windows上的默认值。我要强调的是,重写历史记录在初次导入时非常有用,这就是我现在正在做的,但在您将存储库投入生产后,当然有问题。编辑文件并执行
chmod-R-x+x*
。现在添加/提交/推送可执行位。