我有一个 git 存储库,其中有 LF 和 CRLF 文件的细微变化。
在进行可能的切换之前,我想重写父提交和当前提交具有不同 LR/CRLF 编码的提交。
所以我尝试了以下“一行”(稍作编辑),我尝试运行todos
如果文件的父版本包含 CR。
$ git filter-branch --tree-filter '
echo
P=$GIT_COMMIT^;
FILES=$(git diff --name-only $P);
for a in $FILES; do
if ! git cat-file -e $P:$a; then echo "no parent"; continue; fi;
if git show $:$a | grep -qUP '\r'; then
echo "parent is dos";
todos $a;
else
echo "parent is unix";
fromdos $a;
fi;
done' 23498f..HEAD
这不起作用。任何人都可以发现错误或给出解决此问题的方法吗?
我正在回答我自己的问题。我原来的解决方案中的错误是FILES
设置是错误的,因为没有在重写父级和当前提交,但在original父级和当前提交。
当像这样遍历一组提交时,需要更改的文件不是提交所触及的文件集,而是某些父提交弄乱行结尾的文件集。
这意味着我没有获得正确的文件集。有一个map
提供给过滤器分支表达式的函数,可以将“原始”rev 转换为重写的rev。当我使用该功能时,它可以正常工作。
由此产生的“一行”看起来像这样:
$ git filter-branch -f --tree-filter '
echo "\n $GIT_COMMIT";
P=$(git rev-parse $GIT_COMMIT^);
echo $P;
P=$(map $P);
echo $P;
git cat-file commit $GIT_COMMIT;
FILES=$(git diff --name-only $GIT_COMMIT $P);
echo "FILES:\n$FILES";
for a in $FILES; do
git cat-file -e $P:$a > /dev/null 2>&1 || continue;
if git show $P:$a | grep -qUP '\r'; then
echo "parent is dos $a";
todos $a;
else
echo "parent is unix $a";
fromdos $a;
fi;
done;
git add $FILES;' a6d9e..HEAD
大多数我认为不需要最后一个“git add $FILES”,但这是我使用的命令,我不想提供不正确的答案。
注意:还应该可以定义FILES=$(git diff --name-only a6d9e HEAD)
因此在遍历提交时使用固定集。这可能更简单,但我没有这样做。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)