git status/git diff-C未在索引中检测到文件复制

git status/git diff-C未在索引中检测到文件复制,git,Git,git status[1]的文档表明,它应该能够检测重命名和复制(使用C状态),或者不管git diff-C应该做什么,但这两种方法都不起作用: mkdir test cd test/ git init echo 'Hello World!' > hello.txt echo 'Goodbye World!' > goodbye.txt git add -A git commit -m "Initial commit" cp hello.txt copied.txt mv good

git status
[1]的文档表明,它应该能够检测重命名和复制(使用
C
状态),或者不管
git diff-C
应该做什么,但这两种方法都不起作用:

mkdir test
cd test/
git init
echo 'Hello World!' > hello.txt
echo 'Goodbye World!' > goodbye.txt
git add -A
git commit -m "Initial commit"

cp hello.txt copied.txt
mv goodbye.txt moved.txt
git add -A

$ git status --short
A  copied.txt  <------------ NO COPY DETECTED
R  goodbye.txt -> moved.txt

$ git diff -M -C --summary --cached
 create mode 100644 copied.txt  <------------ NO COPY DETECTED
 rename goodbye.txt => moved.txt (100%)

$ git commit -m Test
$ git diff -M -C --summary HEAD~
  create mode 100644 copied.txt  <------------ NO COPY DETECTED
  rename goodbye.txt => moved.txt (100%)
mkdir测试
cd试验/
初始化
回声“你好,世界!”>hello.txt
回声“再见世界!”>再见.txt
git添加-A
git提交-m“初始提交”
cp hello.txt已复制.txt
mv bye.txt moved.txt
git添加-A
$git状态—短
已复制的.txt moved.txt文件
$git diff-M-C--摘要--缓存
创建模式100644 copied.txt moved.txt(100%)
$git提交-m测试
$git diff-M-C——汇总标题~
创建模式100644 copied.txt moved.txt(100%)
侧面相关问题:在将更改添加到索引之前,是否可以让workdir中的
git status
git diff
检测副本和重命名

[1]

在将更改添加到索引之前,是否可以让workdir中的git status或git diff检测副本和重命名

否,如“.”中所述。
Git将在完整(已提交)树上检测重命名,而不是在添加到索引的部分树上检测重命名

提交后,diff应检测移动/重命名:

git diff -M -C --summary @~
(带@意头)


关于副本,考虑到该提交中未修改复制的文件,您必须使用“
--查找副本”
”选项:

vs

即:

--find-copies-harder
出于性能原因,默认情况下,
-C
选项仅在副本的原始文件在同一变更集中修改时才查找副本 此标志使命令检查未修改的文件作为副本源的候选文件。
对于大型项目来说,这是一项非常昂贵的操作,因此请谨慎使用。
提供多个
-C
选项具有相同的效果


请注意,使用Git 2.17(2018年第2季度),Git状态的输出现在更加精确

参见(2018年2月15日)作者。
(于2018年2月28日合并)

可以从“
git status--chi瓷”
”获得输出“
A
” 通过使用“
--打算添加”
”标志添加文件。
通过在文档表中添加模式来明确这一点


因为没有人知道关于git状态的主要问题的答案,所以我也在git官方邮件列表上问了这个问题[1]:

关于
git status
未检测到文件副本(文档实际上是错误的,它根本没有检测到副本):

git status自2005年年中以来一直使用重命名。提到副本的文档是在很久以后添加的, 以及简短的和瓷器的格式。该代码处理diff引擎抛出的任何内容。我不认为当时有人考虑过这样一个事实,即你实际上不能激发地位去寻找复制品

关于
git diff-C
未检测到文件副本(您还需要传递
--查找副本更难一些
):

默认情况下,-C仅在源文件在同一提交中也被修改时才查找副本。由于您没有在将hello.txt复制到copied.txt的同一提交中修改hello.txt,因此将不考虑修改hello.txt

如果你通过-C-C(两次),或者使用-更难找到副本,Git将考虑存储库中的所有文件。请注意,这可能会较慢,这就是为什么它不是默认值的原因


[1]

那么这与Git文档不一致,Git文档中说,
Git status
可以报告副本和重命名。@Pol一旦提交,是的,Git status可以报告此类重命名。不是在提交之前。我在问题中编辑了测试脚本以添加提交,但之后它仍然没有检测到副本。提交后git status可以报告重命名是什么意思?Git status只报告工作树的状态,而不是提交的“状态”。@Pol它遵循一个启发式:在您的情况下,超过50%的更改,因此不可检测所以。。。git diff部分正是我提到的?
C:\Users\vonc\prog\git\test\mv\test>git diff -M -C --find-copies-harder --summary --cached
 copy hello.txt => copied.txt (100%)
 rename goodbye.txt => moved.txt (100%)
--find-copies-harder