【问题标题】:Git - Discard case only changesGit - 仅丢弃大小写更改
【发布时间】:2013-07-25 21:13:47
【问题描述】:

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

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

  1. 使 Git diff 不区分大小写 - 似乎找不到这样做的方法。它也不会接受对字符串的更改,但这是我愿意为轻松修复而付出的代价。
  2. 在提交前仅使用基于大小写的更改重置大块。
  3. 移至 Visual Source Safe,其中包含不区分大小写差异的选项 - 否...

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

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

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

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

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

非常感谢您的帮助!

【问题讨论】:

    标签: git version-control vb6


    【解决方案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"
    

    【讨论】:

      【解决方案2】:

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

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

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

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

      【讨论】:

        猜你喜欢
        • 2020-06-01
        • 2019-01-14
        • 2015-03-08
        • 2014-01-24
        • 2019-10-12
        • 2010-12-07
        • 1970-01-01
        • 2019-01-11
        • 2016-10-28
        相关资源
        最近更新 更多