修复已提交的空白问题(如将空白空格拖到现有仓库)的最简单解决方案是什么?
答案 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'
尽管如此,我并未在更复杂的存储库上对此进行测试。因此,在测试之前,请确保始终具有备份!