代码之家  ›  专栏  ›  技术社区  ›  Schwern

git重命名匹配是否可以忽略空白更改?

git
  •  2
  • Schwern  · 技术社区  · 6 年前

    当我重命名一个文件并进行空白更改(例如更改缩进)时,git无法识别该重命名。我找不到 git diff 使其在查找重命名时忽略空白的标志。这使得审查其他简单的重构变得困难。

    例如。。。

    $ git init
    $ ruby -e '100.times { puts "Basset hounds got long ears" }' > file
    $ git add file
    $ git commit -m 'first commit'
    $ git mv file file2
    

    现在一切都很好。

    $ git status
    On branch master
    Changes to be committed:
      (use "git reset HEAD <file>..." to unstage)
    
        renamed:    file -> file2
    

    现在,如果我缩进文件中的行,git将不再识别重命名。

    $ ruby -i -pe 'gsub(/^/, "  ")' file2
    $ git add .
    $ git status
    On branch master
    Changes to be committed:
      (use "git reset HEAD <file>..." to unstage)
    
        deleted:    file
        new file:   file2
    

    在我承诺之后 git diff -w HEAD^ 仍然显示删除和新文件。我找不到 差异比较 将识别重命名的选项。

    是否有一组选项允许git在检测副本和重命名时忽略空白?

    1 回复  |  直到 6 年前
        1
  •  0
  •   Fake Code Monkey Rashid    6 年前

    git默认情况下不能这样做。

    但是,如果您有诀窍,可以通过更改相似度索引计算来实现。可以找到相关代码 here 在里面 diffcore-delta.c (有充分的记录)和 here 在里面 diffcore-rename.c .

    请注意,在git检查文件是否可以被视为重命名(内部)之前,需要进行一些初始检查和平衡。此检查将通过,并对以下问题给出“是”答案:

    它是一个普通的非零大小的文件,文件大小没有明显的变化吗?

    因此,一种方法是在该点之前添加条件检查,以便如果空白中只有差异,那么相似度索引计算为100%,否则git应该做它通常做的事情。

    也就是说,您所经历的就是为什么它经常建议您在更改文件内容之前先重命名文件,但是名称在第一次更改时并不是那么容易。