根据这个答案,我无法理解 git diff-filter 的“复制”和“重命名”意味着什么: https: //stackoverflow.com/a/6879568/2039203。当我重命名/移动某些文件时,该文件被处理为“添加”和“删除”。
所以问题是:我应该怎么做才能使用以下两个命令过滤一些文件?我是否需要此过滤器选项来获取已添加/已删除文件的列表?
git diff --diff-filter=C --name-only
Run Code Online (Sandbox Code Playgroud)
和
git diff --diff-filter=R --name-only
Run Code Online (Sandbox Code Playgroud)
git diff如果文件通过“相似性测试”,则会将其显示为“重命名”。为了确保它发生,请指定该-M选项(我将在下面执行此操作)。1
$ mkdir /tmp/temprepo && cd /tmp/temprepo && git init\n$ cat << end > file\n> Here is some text for a file.\n> We want it to be long enough\n> that renames and copies can\n> be detected fairly easily.\n> If we put ten lines into the\n> file, then each percent of\n> similarity is one tenth of\n> each of the lines, i.e., each\n> line represents 10% similarity\n> to the earlier file.\n> end\n$ git commit -m initial\n[master (root-commit) 842824a] initial\n 1 file changed, 10 insertions(+)\n create mode 100644 file\n$ git mv file newname\n$ git diff --cached --name-status\nR100 file newname\nRun Code Online (Sandbox Code Playgroud)\n让我们继续提交这个,这样我们就可以进行git diff两次提交,而不是提交和索引:
$ git commit -m B\n[master a2380eb] B\n 1 file changed, 0 insertions(+), 0 deletions(-)\n rename file => newname (100%)\nRun Code Online (Sandbox Code Playgroud)\n只是为了看看它做了什么:
\n$ git diff --name-status -M HEAD^ HEAD\nR100 file newname\nRun Code Online (Sandbox Code Playgroud)\n现在让我们做一个小小的改变:
\n$ ed newname\n279\n9s/10/about 10/p\nline represents about 10% similarity\nw\n285\nq\n$ git commit -a -m C\n[master 57fce41] C\n 1 file changed, 1 insertion(+), 1 deletion(-)\n$ git diff --name-status -M HEAD~2 HEAD\nR087 file newname\nRun Code Online (Sandbox Code Playgroud)\n(初始提交)和最新提交之间的差异(--name-status选择模式)现在显示文件被重命名为仅具有 87% 相似度,而不是 100% 相似度(如现在在和之间看到的)。2HEAD~2filenewnameHEAD~2HEAD~1
要查看副本,您通常必须使用git diff和-C/或运行--find-copies-harder。
-M您可以控制文件的相似程度,以便使用( 和)之后的数值检测重命名(和副本)-C,例如,-M90%导致上面git diff --name-status将重命名视为添加和删除对:
$ git diff --name-status -M90% HEAD~2 HEAD\nD file\nA newname\nRun Code Online (Sandbox Code Playgroud)\n该-B选项还会影响重命名检测,git config设置diff.renameLimit和diff.renames(请参阅文档)也是如此。要完全击败重命名检测\xe2\x80\x94,这使得在许多情况下编写 git hook 脚本变得更加--diff-filter容易\xe2\x80\x94use --no-renames(或任何不遵守的瓷器命令diff.renames;另请参阅脚注 1)。
1启用时,此相似性测试默认为“50% 相似” diff.renames;禁用时,默认为“仅完全匹配”。在 2.9 之前的 Git 版本中,diff.renames默认为false(禁用);在 2.9 及更高版本中,它默认为true(启用),也可以设置为copy或copies来启用该-C选项。请注意,该diff.renames设置适用于git diff,即 Git 所说的瓷器(或面向用户的)命令,但不适用于例如 ,git diff-tree即 Git 所说的管道命令。如果您希望管道命令执行重命名检测,则必须使用-M或选项。--find-renames
2之前,我们使用了HEAD^and HEAD,但C从那时起我们添加了提交,因此初始提交是 nowHEAD^^或HEAD~2。
| 归档时间: |
|
| 查看次数: |
1431 次 |
| 最近记录: |