gpt4 book ai didi

git - 什么使 git diff --diff-filter=CR 命令中的 C 和 R 过滤器?

转载 作者:行者123 更新时间:2023-12-02 01:06:52 36 4
gpt4 key购买 nike

根据这个答案,我无法理解 git diff-filter 的“复制”和“重命名”是什么意思:https://stackoverflow.com/a/6879568/2039203 .当我重命名/移动某个文件时,该文件被处理为“已添加”和“已删除”。

那么问题来了:我应该怎么做才能使用以下两个命令过滤一些文件?我是否需要此过滤器选项来获取添加/删除文件的列表?

git diff --diff-filter=C --name-only

git diff --diff-filter=R --name-only

最佳答案

git diff如果文件通过了“相似性测试”,它将显示为“已重命名”的文件。为确保它正在发生,请指定 -M选项(我将在下面这样做)。1

$ mkdir /tmp/temprepo && cd /tmp/temprepo && git init
$ cat << end > file
> Here is some text for a file.
> We want it to be long enough
> that renames and copies can
> be detected fairly easily.
> If we put ten lines into the
> file, then each percent of
> similarity is one tenth of
> each of the lines, i.e., each
> line represents 10% similarity
> to the earlier file.
> end
$ git commit -m initial
[master (root-commit) 842824a] initial
1 file changed, 10 insertions(+)
create mode 100644 file
$ git mv file newname
$ git diff --cached --name-status
R100 file newname

让我们继续并提交它,这样我们就可以 git diff两次提交,而不是提交和索引:

$ git commit -m B
[master a2380eb] B
1 file changed, 0 insertions(+), 0 deletions(-)
rename file => newname (100%)

看看它做了什么:

$ git diff --name-status -M HEAD^ HEAD
R100 file newname

现在让我们做一个小改动:

$ ed newname
279
9s/10/about 10/p
line represents about 10% similarity
w
285
q
$ git commit -a -m C
[master 57fce41] C
1 file changed, 1 insertion(+), 1 deletion(-)
$ git diff --name-status -M HEAD~2 HEAD
R087 file newname

--name-status 之间的差异(选择了 HEAD~2 模式) (初始提交)和最新提交现在显示该文件 file已重命名为 newname只有 87% 的相似度,而不是 100% 的相似度(如现在在 HEAD~2HEAD~1 之间看到的那样)。2

要查看副本,您通常必须运行 git diff-C和/或 --find-copies-harder .

您可以控制在 -M 之后使用数值检测重命名(和副本)的相似文件必须达到的程度。 (和 -C ),例如 -M90%导致上述 git diff --name-status将重命名视为添加和删除对:

$ git diff --name-status -M90% HEAD~2 HEAD
D file
A newname

-B选项也会影响重命名检测,git config 也是如此。设置diff.renameLimitdiff.renames (请参阅文档)。完全击败重命名检测——这使得使用 --diff-filter 编写 git 钩子(Hook)脚本成为可能在许多情况下更容易——使用 --no-renames (或任何不遵守 diff.renames 的瓷器命令;另请参见脚注 1)。


1diff.renames 时,此相似性测试默认为“50% 相似”启用,禁用时“仅完全匹配”。在 2.9 之前的 Git 版本中,diff.renames默认为 false (禁用);在 2.9 及更高版本中,它默认为 true (已启用),也可以设置为 copycopies启用 -C选项也是如此。请注意 diff.renames设置适用于 git diff ,这就是 Git 所说的瓷器(或面向用户的)命令,而不是,例如 git diff-tree。 ,这就是 Git 所说的 plumbing 命令。您必须使用 -M--find-renames如果您希望管道命令进行重命名检测,请选择此选项。

2之前,我们使用了HEAD^HEAD ,但我们添加了提交 C从那时起,初始提交现在是 HEAD^^HEAD~2 .

关于git - 什么使 git diff --diff-filter=CR 命令中的 C 和 R 过滤器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21697280/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com