Git:我怎样才能找到与目录最匹配的提交?

Ste*_*lay 39 git diff patch commit

有人拿了Moodle的一个版本(我不知道),在一个目录中应用了很多变化,然后发布它(树在这里).

如何确定最有可能编辑原始项目的哪个提交以形成此树?

这将允许我使用此补丁在适当的提交中形成分支.当然,它来自1.81.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;
Run Code Online (Sandbox Code Playgroud)

第二个只计算了没有上下文的统一差异中的行变化:

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;
Run Code Online (Sandbox Code Playgroud)

有成千上万的提交要挖掘,但这个似乎是最接近的匹配.

kni*_*ttl 12

您可以编写一个脚本,该脚本将给定树与存储库中的修订范围区分开来.

假设我们首先将更改的树(没有历史记录)提取到我们自己的存储库中:

git remote add foreign git://…
git fetch foreign
Run Code Online (Sandbox Code Playgroud)

然后,我们为要匹配的每个修订输出diffstat(简短形式):

for REV in $(git rev-list 1.8^..1.9); do
   git diff --shortstat foreign/master $REV;
done
Run Code Online (Sandbox Code Playgroud)

寻找具有最小更改量的提交(或使用一些排序机制)