Git - 仅丢弃大小写更改

5
所以,我正在使用带有Git Extensions 2的git(在Windows上),用于大型VB6代码库。对于不熟悉VB6的人来说,它是大小写不敏感的,并且在保存文件时更改变量名称的大小写。可以采取措施来最小化这种行为(参见Stop Visual Basic 6 from changing my casing),但无法完全通过这种方式消除问题。问题当然是大小写更改会显示为Git中的更改,从而干扰提交历史记录,以至于实际更改几乎不可能找到。
我正在寻找一种处理源代码控制方面的方法,并将感谢任何意见。我目前正在追求的途径按优先顺序如下:
1. 使Git diff对大小写不敏感-似乎找不到方法。它也不会捕捉字符串的更改,但这是我愿意为简单的解决方案支付的代价。
2. 在提交之前重置仅具有基于大小写的更改的巨块。
3. 切换到Visual Source Safe,它具有大小写不敏感diff选项-不...
我觉得选项2可能是最好的选择,但我不确定处理它的最佳方式。我的思路是:
  • 创建一些工具来自动化Git命令行
  • 使用交互式提示迭代所有更改,分解到最小的块
  • 对于每个块,如果唯一的更改是大小写,就将其重置
我相信这是可能的最好解决方案。在暂存之前运行此工具将解决所有问题。有人对这种方法有什么想法吗?
此外,如果我走这条路线,最好有一个Git钩子来防止任何仅大小写更改。我完全不知道如何实现这样的脚本,所以任何帮助创建这样的脚本都将是很棒的。
为了给出问题的规模,当变量的大小写更改时,它将更改打开文件中具有相同名称的每个变量的每个实例。每次提交,这将发生在几个变量上,并且似乎每个修改的文件的约30%已更改。这使得手动过程(这是我目前正在做的)相当不切实际,并且只适用于非常小的提交。
非常感谢任何帮助!
2个回答

1
#!/bin/bash

# Script to discard any case only changes that haven't been staged.

# Create a backup of the current changes
BACKUPFILE="$( date +%Y%m%d%H%M%S.backup.patch )"
git diff > $BACKUPFILE

# For each file that has been changed
for f in $( git diff --name-only --ignore-submodules=all); do

    # Create a case insensitive patch
    git show :$f | diff -uiw - $f > temp.patch;

    # Reset the file
    git checkout -- $f;

    # Apply the case insensitive patch, hence discarding case only changes
    git apply --whitespace=nowarn temp.patch;

    # git apply doesn't respect autocrlf so replace all LF with CRLF
    # $ matches the end of line
    # '\r' expands to CRLF in a bash shell
    sed s/$/'\r'/ $f > temp.txt;
    mv temp.txt $f;

    # clean up temporary files
    rm temp.patch;

done

echo "If everything is as expected you can delete $BACKUPFILE.
If things have gone wrong you can revert to your previous state by executing;

    git reset --hard HEAD
    git apply $BACKUPFILE"

0
面对这个问题,我编写了一个程序,它知道我代码中使用的所有名词,并将它们翻转到适当的大小写 - 这将是在预提交钩子中运行的东西。
我认为它还有一个发现例程,当它发现新的Dim语句时会添加到库中。
这意味着您必须对每个变量名称保持一致的大小写(除非您添加一些忽略某些单词的方法)。
唉,我不再拥有它了... 我的大部分VB6工具包都已经消失在天堂的/dev/null中。我记得文件开头有一些行结束符的特殊情况。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接