删除Git中的历史尾随空格

时间:2013-08-06 09:21:39

标签: git

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

3 个答案:

答案 0 :(得分:4)

刚刚在git-docs中发现(待测试):

git-rebase --whitespace=fix

也可以是一种选择。

见:

答案 1 :(得分:3)

如果你的repo中有现有的提交有尾随空格,那么你需要更改那些提交(重写历史记录),如果该repo已被其他人推送和克隆,这可能会很痛苦。

但如果这是一个选项,那么您可以使用像one in gitolite

这样的脚本
#!/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'

答案 2 :(得分:1)

本来我希望将其添加为已被接受的answer的注释,但我只是注册以分享我的发现,并且还没有足够的声誉。

如果重写历史记录(从而更改所有提交哈希值) 是一种选择,那么像上述答案中的过滤器脚本似乎是最好的方法。但是,当我尝试从那里使用ws-fix.sh'脚本时,map函数不可用。快速浏览git-filter-branch.sh的最新source,似乎map函数(默认)仅在commit-filter中可用,但index-filter中。只是为了确保我也尝试导出map函数而没有成功。最终使它对我有用的是,只需在过滤器ws-fix.sh脚本本身内重新定义map函数:

#!/bin/bash

map()
{
    if test -r "../map/$1"; then
        cat "../map/$1"
    else
        echo "$1"
    fi
}

if git rev-parse --quiet --verify $GIT_COMMIT^ > /dev/null
then
        against=$(map $(git rev-parse $GIT_COMMIT^))
        git reset --quiet $against -- .
else
        against=$(git hash-object -t tree /dev/null)
        git rm --quiet --force --ignore-unmatch --cached -r '*'
fi

git diff --full-index $against $GIT_COMMIT | git apply --cached --whitespace=fix 2> /dev/null

使用此版本,到目前为止,我可以毫无问题地应用index-filter

git filter-branch --index-filter '~/ws-fix.sh'

尽管如此,我并未在更复杂的存储库上对此进行测试。因此,在测试之前,请确保始终具有备份