我有一个包含源代码的目录。有一个包含该项目的存储库,但有问题的目录没有任何元数据或任何手动报告它所基于的版本。如何找到最接近的版本(它可能包含一些从未签入的修改)?
答案 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)
如果您的历史记录合理,请尝试以下方法:
--work-tree
设置为您拥有源代码的目录答案 3 :(得分:0)
也许您可以滥用git bisect
:
git bisect bad
git bisect good
git status --work-tree=/path/to/your/sources