Git - 丢弃案例只会改变

时间:2013-07-25 21:13:48

标签: git version-control vb6

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

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

  1. 使Git diff case不敏感 - 似乎找不到这样做的方法。它也不会对字符串进行更改,但这是我愿意为简单修复付出的代价。
  2. 在提交之前仅使用基于案例的更改重置hunks。
  3. 移至Visual Source Safe,它具有不区分大小写的差异选项 - 否......
  4. 我有一种感觉,2号选项可能是我最好的选择,但我并不确定最好的方法来处理它。我目前的想法是:

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

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

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

    要想知道问题的规模,当变量的情况发生变化时,它将改变打开文件中具有相同名称的每个变量的每个实例。每次提交时,都会发生几个变量,看起来好像每个修改过的文件中有~30%已经改变了。这使得手动过程(我正在做的事情)非常不切实际,只对真正的小提交有用。

    非常感谢您的帮助!

2 个答案:

答案 0 :(得分: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"

答案 1 :(得分:0)

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

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

这确实意味着你必须保持一致,以防每个变量名称(除非你添加忽略某些单词的方法)。

唉,我不再有它了...我的VB6工具包的大部分内容已经转移到天空中的/dev/null。我记得,在文件的开头有一些带有行尾的特征。