删除Git中的历史尾随空格

删除Git中的历史尾随空格,git,Git,修复已提交的空白问题(如将空白拖到现有回购)的最简单解决方案是什么?如果您的回购中已有带有空白拖到的提交,那么您需要更改这些提交(重新连接历史记录),如果该回购已被其他人推送和克隆,这可能会很痛苦 但如果这是一个选项,则可以使用如下脚本: 像这样运行: 刚刚在git文档中发现(待测试): 也可能是一种选择 见: 我更愿意将此作为评论添加到已被接受的内容中,但我只是注册来分享我的发现,目前还没有足够的声誉 如果重写历史记录(从而更改所有提交哈希值)是一个选项,那么像上面提到的答案那样的筛选脚

修复已提交的空白问题(如将空白拖到现有回购)的最简单解决方案是什么?

如果您的回购中已有带有空白拖到的提交,那么您需要更改这些提交(重新连接历史记录),如果该回购已被其他人推送和克隆,这可能会很痛苦

但如果这是一个选项,则可以使用如下脚本:

像这样运行:


刚刚在git文档中发现(待测试):

也可能是一种选择

见:


我更愿意将此作为评论添加到已被接受的内容中,但我只是注册来分享我的发现,目前还没有足够的声誉

如果重写历史记录(从而更改所有提交哈希值)是一个选项,那么像上面提到的答案那样的筛选脚本似乎是最好的方法。但是,当我尝试从那里使用
ws-fix.sh'
脚本时,
map
函数不可用。从最近的
git filter branch.sh
快速查看,似乎
map
功能(默认情况下)仅在中可用,但在中不可用。为了确定,我还尝试导出
map
函数,但没有成功。使它最终对我起作用的是,只需在fix.sh脚本本身中重新定义map函数:

#/bin/bash
地图()
{
如果测试-r“./map/$1”,则
类别“./地图/$1”
其他的
回音“$1”
fi
}
如果git rev parse--quiet--verify$git_COMMIT^>/dev/null
然后
反对=$(映射$(git rev parse$git_COMMIT^))
git重置--quiet$对--。
其他的
反对=$(git散列对象-t tree/dev/null)
git-rm--quiet--force--ignore unmatch--cached-r'*'
fi
git diff--完全索引$vs$git_COMMIT | git apply--缓存--空白=fix 2>/dev/null
使用此版本,我可以应用
索引过滤器
,迄今为止没有任何问题:

git过滤器分支--索引过滤器'~/ws-fix.sh'

不过,我没有在更复杂的存储库上测试这一点。因此,请确保在测试前始终进行备份

修复空白问题并提交它们?如果您还没有推出,那么使用git commit--amend将更好;将来您可能会启用默认的
pre-commit
hook,它可以防止尾随空格。与我自己的答案相比,
git过滤器分支的有趣变化。向上投票。
#!/bin/bash

# from doener (who else!)
# to be called as an index-filter

if git rev-parse --quiet --verify $GIT_COMMIT^ >/dev/null
then
        against=$(map $(git rev-parse $GIT_COMMIT^))
        git reset -q $against -- .
else
        # Initial commit: diff against an empty tree object
        against=4b825dc642cb6eb9a060e54bf8d69288fbee4904
        git rm --cached -rfq --ignore-unmatch '*'
fi

git diff --full-index $against $GIT_COMMIT | git apply --cached --whitespace=fix
git filter-branch --index-filter '. ~/git-scripts/ws-fix.sh'
git-rebase --whitespace=fix