4

所以,我正在使用带有大型 VB6 代码库的 git(在 Windows 上使用 Git Extensions 2)。对于不熟悉 VB6 的人来说,它不区分大小写,并且习惯于在保存文件时更改变量名的大小写。可以采取一些步骤来最小化这种行为(请参阅停止 Visual Basic 6 更改我的大小写),但以这种方式完全消除问题是不可行的。问题当然是案例更改显示为 Git 中的更改,因此干扰了提交历史,以至于几乎不可能找到实际更改。

我正在寻找一种从源代码控制方面处理此问题的方法,并希望得到任何输入。我目前追求的途径按优先顺序排列是:

  1. 使 Git diff 不区分大小写 - 似乎找不到方法来做到这一点。它也不会接受对字符串的更改,但这是我愿意为简单修复付出的代价。
  2. 在提交之前仅使用基于案例的更改来重置大块。
  3. 移至具有不区分大小写差异选项的 Visual Source Safe - 否...

我有一种感觉,选项 2 可能是我最好的选择,但我不确定处理它的最佳方法。我目前的思路是:

  • 创建一些工具来自动化 Git 命令行
  • 使用交互式提示迭代所有更改,分解为最小的块
  • 对于每个大块,如果唯一的更改是仅大小写,请重置它

我很确定这是一个尽可能好的解决方案。在暂存前运行此工具将解决所有问题。有人对这种方法有任何想法吗?

另外,如果我确实走这条路,最好有一个 Git 挂钩来防止任何情况下的更改。我完全不知道如何实现这样的东西,所以对创建这样一个脚本的任何帮助都会很棒。

为了了解问题的规模,当变量的情况发生变化时,它将改变打开文件中每个具有相同名称的变量的每个实例。每次提交,这都会发生在几个变量上,并且看起来好像每个修改文件的 30% 都发生了变化。这使得手动过程(这是我目前正在做的)非常不切实际,并且仅对非常小的提交有用。

非常感谢您的帮助!

4

2 回答 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"
于 2014-11-03T11:32:21.267 回答
0

面对这个问题,我编写了一个例程,它知道我的代码中使用的所有名词,并将它们翻转到适当的大小写——这将是在预提交钩子中运行的东西。

我认为它还有一个发现例程,当它发现新的 Dim 语句时会添加到库中。

这确实意味着您必须在每个变量名称的情况下保持一致(除非您添加忽略某些单词的方法)。

唉,我再也没有它了……我的大部分 VB6 工具包已经飞到/dev/null了天空中。我记得在文件的开头有一些带有行尾的特殊性。

于 2013-07-26T20:37:46.160 回答