Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Git:如何找到与目录最匹配的提交?_Git_Diff_Commit_Patch - Fatal编程技术网

Git:如何找到与目录最匹配的提交?

Git:如何找到与目录最匹配的提交?,git,diff,commit,patch,Git,Diff,Commit,Patch,有人获取了Moodle的一个版本(我不知道),在一个目录中应用了许多更改,并发布了它() 如何确定最有可能编辑原始项目的哪个提交以形成此树? 这将允许我使用此修补程序在适当的提交位置形成分支。当然,它来自于或分支,可能来自于一个发布标签,但是在特定的提交之间进行区分对我帮助不大 尸检更新:让我尽可能接近。我首先将我的补丁repo添加为远程“外来”(没有共同的提交,这没关系),然后使用两个格式选项在循环中进行diff。第一个使用了--shortstat格式: for REV in $(git re

有人获取了Moodle的一个版本(我不知道),在一个目录中应用了许多更改,并发布了它()

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

这将允许我使用此修补程序在适当的提交位置形成分支。当然,它来自于或分支,可能来自于一个发布标签,但是在特定的提交之间进行区分对我帮助不大

尸检更新:让我尽可能接近。我首先将我的补丁repo添加为远程“外来”(没有共同的提交,这没关系),然后使用两个格式选项在循环中进行diff。第一个使用了
--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;
第二个只是在没有上下文的统一diff中计算行更改:

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;

有数千个提交需要挖掘,但似乎是最接近的匹配项。

使用“git责备”怎么样?它将为每一行显示谁更改了它,以及在哪个版本中进行了更改。

您可以编写一个脚本,将给定的树与存储库中的某个版本范围进行区分

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

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

查找更改量最小的提交(或使用某种排序机制)

使用git从所有版本的1.8创建补丁怎么样。以及本新版本的1.9。 然后你可以看到哪个补丁更“有意义”

例如,如果补丁“删除”了许多方法,那么它可能不是这个版本,而是以前的版本。如果补丁有许多部分作为一个单独的编辑是没有意义的,那么它可能也不是这个版本

等等。。。不幸的是,在现实中,没有一种算法可以完美地做到这一点。我必须采取一些启发性措施。

这是我的解决方案:

#/垃圾箱/垃圾箱
开始日期=“2012-03-01”
结束日期=“2012-06-01”
打捆针\u ref=“aaa”
echo”“>/tmp/script.out;
shas=$(git log--oneline--all--after=“$start_date”---until=“$end_date”| cut-d'-f1)
以$sha为单位的sha
做
wc=$(git diff——仅名称“$needle_ref”“$sha”| wc-l)
wc=$(printf%04d$wc);
echo“$wc$sha”>>/tmp/script.out
完成
cat/tmp/script.out | grep-v^$| sort | head-5

这里有一些非常好的解决方案

我使用了类似的方法,尝试查找壁橱源文件修订版(给定目标文件):

  • 向后迭代分支中的所有提交
    merge
  • 正在查找与文件
    target.txt最接近的匹配项
  • 打印出git
    修订版
    ,以及不同文本行数
  • 注意:在新的丢弃分支内执行-
    重置-硬
    是破坏性的(afaik)

    <代码>以美元为单位的版本(git版本列表合并);做 git重置--硬“$REV” echo“$REV”`comm-2-3 source.txt../target.txt | wc-l` 完成
    您将得到如下输出,它告诉您哪个版本最匹配(即,差异最小的行):

    1c58bd5925a1fc8233730626*******************771
    头现在在。。。
    9B2C29B00F1B4541A1A35906*******************775
    头现在在。。。
    b8e0bf5ec4372ebbcbd4edd0*******************342
    头现在在。。。
    ba0d474bf2aac40dae48923e*********************342
    头现在在。。。
    
    6d96921d3e9ad760ce55e76c***************335如果您能找到一些有意义的测试,可以应用于moodle repo的特定提交和moodle rubric的初始提交,以确定后者是发生在前者之前还是之后,您可以使用
    git bisect
    快速了解源提交。查看《git bisect——瘦子的帮助》
    。感谢您现在使用它并取得了巨大成功。使用
    cat rdiffs.txt | grep-oe'[0-9]*insertions'| sort-n | head-n 10
    (及类似内容)缩小更改量的最小范围,而无需进行任何手动搜索。仅提及以防任何人发现附加信息方便。这只适用于具有历史记录的提交,而这正是这里的问题:缺少历史记录和分支点我最终不得不指定分支(主分支),删除--all,因为它还搜索了指针参考,导致零差异;这个脚本很好,除了最后一行之外,它最终选择了最低的差异-如果日期范围包括我们正在比较的签入(即,needle_ref),那么它将以0个不同的文件获胜。我建议将最后一行更改为:“cat/tmp/script.out | grep-v^$| sort | head-5”-这将显示文件更改最少的5个签入。我认为这需要