查找导出来自哪个版本

时间:2015-07-27 13:48:21

标签: git

我有一个包含源代码的目录。有一个包含该项目的存储库,但有问题的目录没有任何元数据或任何手动报告它所基于的版本。如何找到最接近的版本(它可能包含一些从未签入的修改)?

4 个答案:

答案 0 :(得分:2)

受到eckes'建议的启发,我发现了以下shell脚本:

#!/bin/sh

if [ "$#" -lt 1 ]; then
    echo "Usage: $0 path-to-export [rev-list-options...]"
    exit 1
fi

alt_work_tree=$1
shift

git rev-list "$@" | {
    min_changes=$(git --work-tree="$alt_work_tree" status --porcelain | wc -l)
    closest_revs=$(git rev-parse HEAD)
    lines=0

    while read revision; do
    git checkout -q "$revision"
    n_changes=$(git --work-tree="$alt_work_tree" status --porcelain | wc -l)
    if [ "$n_changes" -lt "$min_changes" ]; then
        min_changes=$n_changes
        closest_revs=$revision
    elif [ "$n_changes" -eq "$min_changes" ]; then
        closest_revs="$closest_revs $revision"
    fi
    lines=$((lines + 1))

    printf "rev: %s n: %s min_changes: %s   \r" "$revision" "$lines" "$min_changes"
    done

    echo
    echo "Number of changes left: $min_changes"
    echo "Possible revisions: $closest_revs"
    echo "Checking out: ${closest_revs%% *}"
    git checkout -q "${closest_revs%% *}"
}

对于一个案例,我试过它找到了一个匹配的修订版,对于另一个案例,它发现了一些有意义的东西并且没有完全匹配,所以我想它完成了工作。

脚本效率很低,因为它会检出每个修订版,这是完全没必要的。但是,我无法快速获得git status使用不同的索引文件。

随意使用和修改您喜欢的任何内容。

答案 1 :(得分:1)

您可以在相关目录中初始化存储库。

然后使用 foo: type: string column: foo nullable: true ,您可以看到树对象。

现在,您可以迭代提交并尝试使用相同的树-SHA1总和查找提交。

如果不是这种情况,请使用git cat-file commit HEAD并迭代所有提交以查找尽可能接近的树。

答案 2 :(得分:1)

如果您的历史记录合理,请尝试以下方法:

  • 转到您的回购
  • 遍历此repo的修订版并将--work-tree设置为您拥有源代码的目录
  • 检查哪个版本与目录状态的差异最小

答案 3 :(得分:0)

也许您可以滥用git bisect

  • 使用git bisect bad
  • 启动二等分过程
  • 声明回购邮件中的第一个提交是git bisect good
  • 现在,bisecting将为您提供bisecting的修订
  • 为每个步骤发出git status --work-tree=/path/to/your/sources
    • 如果您的差异很小,则认为此修订版本不错
    • 如果您有很多不同之处,请声明此修订版本不合格