当前位置: 首页 > 知识库问答 >
问题:

是否可以强制“git diff”为不是repopsitory的文件显示“相似性索引”

胡和煦
2023-03-14

我想使用git-diff的“相似性索引”计算特性来计算git存储库之外的文件。

下面是git diff的输出示例,用于未被git跟踪的文件(第一个diff,即我得到的)和被git跟踪的文件(第二个diff,即我想要的,但也用于外部文件)

$ seq 1 3 > file1 ; cp file1 file2 ; echo 4 >> file2            # create files
$ git diff -C file1 file2                                       # show diff (no repo, -C has no effect)
diff --git 1/file1 2/file2
index 01e79c32a8c9..94ebaf900161 100644
--- 1/file1
+++ 2/file2
@@ -1,3 +1,4 @@
 1
 2
 3
+4
$ git init > /dev/null                                          # create repo
(master #%)$ (git add file1; git commit -m file1) > /dev/null   # add file1
(master %)$ (git add file2; git commit -m file2) > /dev/null    # add file1
(master %)$ git diff -C HEAD^                                   # show diff (in repo, -C works)
diff --git c/file1 w/file2
similarity index 75%
copy from file1
copy to file2
index 01e79c32a8c9..94ebaf900161 100644
--- c/file1
+++ w/file2
@@ -1,3 +1,4 @@
 1
 2
 3
+4
  • 如何使用Git比较两个不在repo中的文件
  • 如何在Git存储库之外使用`Git diff--color-words'?

和其他一些相关的。

我阅读了Git diff手册,甚至一些Git的diff源代码,看起来相似性索引总是显示在重命名(状态为R)或复制(C)的文件中,有时只显示在修改(M)的文件中:

还是需要在git-diff(可能是--appure-copy)中添加新的选项来强制执行所需的状态?

共有1个答案

冯永长
2023-03-14

无法触发Git对既不在索引中也不在Git树对象中的文件运行其相似性索引计算。这有点遗憾,因为这样的选项不会特别难编码,而且如果能问Git文件X和y有多相似就好了?对于任何任意的文件对,不管是否在存储库中。

也就是说,如果有两个没有提交的文件,并且希望Git为它们计算相似度索引,那么只需创建两个提交,或者两棵树,只包含这两个文件。没有前端命令来执行此操作,但构建自己的命令并不难。下面是这样做的脚本片段:

#! /bin/sh -e

export GIT_INDEX_FILE=$(mktemp)
rm $GIT_INDEX_FILE
trap "rm -f $GIT_INDEX_FILE" 0 1 2 3 15
hash=$(git hash-object -t blob -w /tmp/file1)
git update-index --add --cacheinfo 100644,$hash,file
tree1=$(git write-tree)
hash=$(git hash-object -t blob -w /tmp/file2)
git update-index --add --cacheinfo 100644,$hash,file
tree2=$(git write-tree)

我们现在需要告诉Git比较这两棵树:

git diff-tree $tree1 $tree2

不过,这不会触发相似度计算。理论上,添加-b应该可以做到这一点,但我无法使其发挥作用。

我所做的工作是通过为文件使用两个名称并添加显式的-m调用重命名检测器。必须有匹配项,否则只得到D-和-A。您还必须删除两个git update-index操作之间的临时索引文件,或者显式清除file1条目:

#! /bin/sh -e
export GIT_INDEX_FILE=$(mktemp)
rm $GIT_INDEX_FILE
trap "rm -f $GIT_INDEX_FILE" 0 1 2 3 15
hash1=$(git hash-object -t blob -w /tmp/file1)
git update-index --add --cacheinfo 100644,$hash1,file1
tree1=$(git write-tree)
rm -f $GIT_INDEX_FILE
hash2=$(git hash-object -t blob -w /tmp/file2)
git update-index --add --cacheinfo 100644,$hash2,file2
tree2=$(git write-tree)

git diff-tree -M1% $tree1 $tree2

/tmp/file1/tmp/file2这两个文件上运行,其中一行匹配,我得到:

$ /tmp/foo.sh
:100644 100644 2175e89fddda9d80aa15f579dba8605d5ed84af4 a63117dbbc7985b3984daa948aa87eaed8ea89ad R066   file1   file2
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
minimum
babababababababababababababababababababababababababababababababababaa
minimum

给出了010的相似度,而使file2的第一行全B字符给出了092的相似度。匹配最小行是必需的,否则文件根本不匹配,这就变成了删除-添加。

 类似资料:
  • 我正在创建一个网站(快速网络)在2种语言-英语和希伯来语。我有一个输入字段(段塞/用户名),必须是英文(字母数字拉丁字符)。当我从手机进入网站时,我可以用希伯来语写文本。在这个输入字段中,是否可以强制键盘为英文?我注意到电子邮件地址(电子邮件输入)的键盘已经是英文的了。 更新:在服务器端,我们会验证输入。我不想在客户端验证输入(使用JavaScript)或阻止用户键入希伯来字符(这可能会在以后完成

  • 我有一些代码使用聚合物属性e <代码> polymer的工作方式是,我不能简单地说<code>force-shorrow=“false”,如果我想禁用该属性,必须将其完全删除。在Angular2中是否有方法有条件地删除整个属性?我似乎找不到关于这个话题的任何信息。我可以使用并重复整个元素,包括属性和不包括属性,但如果可能的话,我宁愿不这样做。谢谢 编辑 - 为什么将此问题标记为重复并关闭?我在有问

  • 我目前正在为我的电视节目网络应用程序创建一个实时搜索的过程中。一切都很好。不过,我希望的是,如果筛选的搜索为空,则不显示 我当前的实现不工作。 匿名用户 你可以做 但是这有一个性能问题(多次使用过滤器)。看看如何显示过滤的ng-repeat数据的长度

  • 在crosswalk中,可以使用cordova插件 而cordova inAppBrowser似乎工作得很好。但它仍然使用旧的android浏览器,而不是crosswalk chromium(因此不支持所需的HTML5功能)。 我可以通过检查user-agent(例如:

  • 我目前正在一个kotlin多项目解决方案。我有一个项目定义了一些数据类,并定义了一个api来访问MongoDB。objectId是自动创建的。这个项目使用的是Morphia:1.3.2。使用以下函数存储条目: 由于在请求目标中发现异常中定义。请求如下所示: 我有点不知道如何解决这个问题。

  • 问题内容: 题 是否可以使Log4J显示其用于配置的文件的完整路径? 背景 我与log4j有爱恨交织的关系。在好的时候,它很棒,但是当它不起作用时,它可能是最难调试的事情之一。我管理应用程序中的所有日志记录。因此,我对日志记录和手册中定义的默认初始化过程非常熟悉。 不过,似乎每隔几周,记录就会中断,我花 了很多 时间来解决问题。 这次,它被严重破坏了。每个地方的每个日志语句都被转储到控制台中,我不