gpt4 book ai didi

git - 显示 Git 存储库中两个文件的相似性索引

转载 作者:行者123 更新时间:2023-12-04 01:05:49 24 4
gpt4 key购买 nike

是否可以使用 git diff 显示 Git 存储库中两个文件的相似性索引?根据手册页,git diff -p在某些情况下可能会使用此信息生成补丁,但例如以下命令不包含相似性索引信息:

git diff -p --no-index a b
哪里 ab是存储库已知的两个文件。是否可以让 Git 计算并报告存储库中两个现有文件之间的相似性指数?

最佳答案

不幸的是,没有——或者更准确地说,没有任何现有的前端命令。让 Git 计算两个文件的相似性索引的唯一方法是创建两个树对象,在 Git 看来,文件被重命名是可能的。
然而,我们可以做到这一点。这是方法:

  • 创建临时索引文件名。
  • 将第一个文件添加到临时索引并写出一棵树,保存其哈希 ID。
  • 删除第一个文件并添加第二个文件;像以前一样写出一棵新树。
  • --find-renames=01 区分两棵树.

  • (使用 00 的重命名阈值不起作用:这只会禁用重命名检测。)
    我把它包装成一个脚本 here并且也出现在下面。将脚本放在您的 $PATH 中的某个位置(我使用 $HOME/scripts/ 作为包含可在任何架构上运行的可执行脚本的目录)并且您可以运行 git similarity a b .
    (这是经过轻微测试的。)

    #! /bin/sh
    #
    # git-similarity: script to compute similarity of two files

    . git-sh-setup # for die() etc

    TAB=$'\t'

    # should probably use OPTIONS_SPEC, but not yet
    usage()
    {
    echo "usage: git similarity file1 file2"
    }

    case $# in
    2) ;;
    *) usage 1>&2; exit 1;;
    esac

    test -f "$1" || die "cannot find file $1, or not a regular file"
    test -f "$2" || die "cannot find file $2, or not a regular file"
    test "x$1" != "x$2" || die "file names $1 and $2 are identical"

    TF=$(mktemp) || exit 1

    trap "rm -f $TF" 0 1 2 3 15
    export GIT_INDEX_FILE=$TF

    # create a tree holding (just) the argument file
    maketree() {
    rm -f $TF
    git add "$1" || exit 1
    git write-tree || exit 1
    }

    # Use git diff-tree here for repeatibility. We expect output of
    # the form Rnnn$TAB$file1$TAB$file2, but if we get two lines,
    # with D and A, we'll just print 000 here.
    print_similarity() {
    set $(git diff-tree --name-status --find-renames=01 $1 $2)
    case "$1" in
    R*) echo "${1#R}";;
    *) echo "000";;
    esac
    }

    h1=$(maketree "$1")
    h2=$(maketree "$2")
    print_similarity $h1 $h2

    关于git - 显示 Git 存储库中两个文件的相似性索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66526555/

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