Git:我怎样才能find一个最接近目录的提交?
有人拿了Moodle的一个版本(我不知道),在一个目录中应用了许多变化,并释放它( 树在这里 )。
我怎样才能确定原始项目的哪个提交最有可能被编辑来形成这棵树?
这将允许我在此补丁的适当提交下形成一个分支。 当然,它来自1.8或1.9分支,可能来自发布标签,但在特定的提交之间的差异并没有多大帮助。
尸检更新: knittl的答案让我尽可能接近我将要得到的。 我首先添加了我的补丁回购作为远程“外国”(没有共同的承诺,没关系),然后在循环与几个格式选项差异。 第一个使用了--shortstat
格式:
for REV in $(git rev-list v1.9.0^..v1.9.5); do git diff --shortstat "$REV" f7f7ad53c8839b8ea4e7 -- mod/assignment >> ~/rdiffs.txt; echo "$REV" >> ~/rdiffs.txt; done;
第二个只是在没有上下文的统一比较中统计线条的变化:
for REV in $(git rev-list v1.9.0^..v1.9.5); do git diff -U0 "$REV" f7f7ad53c8839b8ea4e7 -- mod/assignment | wc -l >> ~/rdiffs2.txt; echo "$REV" >> ~/rdiffs2.txt; done;
有成千上万的承诺挖掘,但这似乎是最接近的匹配。
你可以编写一个脚本,它可以根据你版本库中的版本范围来区分给定的树。
假设我们首先将更改后的树(没有历史logging)提取到我们自己的存储库中:
git remote add foreign git://… git fetch foreign
然后我们为每个我们想要匹配的版本输出diffstat(简写):
for REV in $(git rev-list 1.8^..1.9); do git diff --shortstat foreign/master $REV; done
用最小的变化量来查找提交(或者使用一些sorting机制)
这是我的解决scheme:
#!/bin/sh start_date="2012-03-01" end_date="2012-06-01" needle_ref="aaa" echo "" > /tmp/script.out; shas=$(git log --oneline --all --after="$start_date" --until="$end_date" | cut -d' ' -f 1) for sha in $shas do wc=$(git diff --name-only "$needle_ref" "$sha" | wc -l) wc=$(printf %04d $wc); echo "$wc $sha" >> /tmp/script.out done cat /tmp/script.out | grep -v ^$ | sort | head -5
如何使用git从1.8的所有版本创build一个补丁。 和1.9这个新版本。 那么你可以看到哪个补丁更有意义。
例如,如果修补程序“删除”了许多方法,那么可能不是此版本,而是之前的版本。 如果修补程序有许多部分作为一个单独的编辑是没有意义的,那么它也可能不是这个版本。
等等……实际上,不幸的是,还没有一个algorithm来完成这个工作。 我将不得不有一些启发式的。
如何使用“混帐”? 它会告诉你,每一行,谁改变它,以及在哪个版本。