我遇到了一个问题,与Step through a file's history in git; similar to p4v timelapse讨论的问题不同,但却有很大不同。
我有一个Git存储库,有6个分支,300多个文件和600多个提交。
我还有一个代码体,它是同一个存储库的(未提交的原始文件)分支...没有.git
文件夹。换句话说,我有一组300多个文件,没有历史记录,没有提交标签或哈希数字。
我想重新整合这个非正式的分支,作为一个正式的分支。
我需要找到哪个提交被复制,没有.git
,然后进行编辑。
如何有效地执行此操作,即无需执行手动'结帐'所有600多次提交并运行diff / meld并计算已更改文件的数量?
答案 0 :(得分:0)
您基本上希望找到与工作目录的某个状态最相似的提交。首先创建一个本地分支并提交这些300多个文件,以便它们成为提交。然后,使用git diffs查找最相似的提交。
以下脚本应该可以解决问题。它查找给定范围内的所有提交,然后估计每次提交和引用提交之间的不同行数。最后它找到了最小的差异。
#!/bin/bash
commit_to_compare_with=d67e
commit_range=1cb1d..e172
list_of_commits=($(git rev-list $commit_range))
num_of_commits=${#list_of_commits[@]}
minimal_diff_count=100000000
echo
echo Found $num_of_commits commits in the range $commit_range
echo
count_lines_of_diff() { git diff $1 $2 | wc -l; }
for c in "${list_of_commits[@]}"
do
diff_count=$(count_lines_of_diff $commit_to_compare_with $c)
echo ${c:0:4} differs from ${commit_to_compare_with:0:4} by $diff_count lines
if [ $diff_count -lt $minimal_diff_count ]
then
most_similar_commit=$c
minimal_diff_count=$diff_count
fi
done
echo
echo Most similar commit to $commit_to_compare_with is $most_similar_commit
这是我得到的输出:
Found 5 commits in the range 1cb1d..e172
e172 differs from d67e by 45 lines
1431 differs from d67e by 26 lines
20e2 differs from d67e by 347 lines
fb80 differs from d67e by 347 lines
8d67 differs from d67e by 360 lines
Most similar commit to d67e is 14310bc0cf69967d4781e0aec2fd2cca21d72ac6