移动后,当文件被显着修改时,Git不会检测重命名

时间:2016-01-12 23:13:15

标签: git

考虑这个测试脚本。

$props = $dataSet.Tables[0] |
         Select-Object * -ExcludeProperty RowError, RowState, ItemArray,
           HasErrors, Table -First 1 |
         ForEach-Object { $_.PSObject.Properties | Select-Object -Expand Name }

$dataSet.Tables[0] |
  ConvertTo-Html –Body $body -Property $props |
  Out-File -Append $OutputFile

我想要发生的是让git检测到#!/bin/sh -x rm -rf test git init test cd test for I in {1..100}; do echo $I >> x done git add x git commit -am "initial commit" git checkout -b branch git mv x y git commit -am "renamed" rm y for I in {1..60}; do echo branch$I >> y done for I in {61..100}; do echo $I >> y done git commit -am "changed the first 60 lines in branch" git checkout master rm x for I in {1..60}; do echo master$I >> x done for I in {61..100}; do echo $I >> x done git commit -am "changed the first 60 lines in master" git merge -s recursive -X patience branch git status 在分支中被重命名为x,并让我有机会解决合并冲突。

相反,git忽略(无法检测)重命名,并且在创建新的无关文件y时,分支中删除了x。 我如何说服git将其作为重命名的文件处理?

谢谢!

1 个答案:

答案 0 :(得分:5)

你是对的:git重命名检测,而不是重命名跟踪,如果文件已经改变了太多" (对于某些值"太多"),git声明这是一个不同的文件,而不是重命名的文件。

对此没有完美的解决方法。如果您的git足够新(1.7.4或更高版本),通常最好的选择是将-X rename-threshold=<n>标记传递给git merge。降低阈值使git检测更多重命名(并且您可以使用git diff -M来测试适当的阈值)。