Git: Как найти коммит, который наиболее точно соответствует каталогу?

Кто-то взял версию Moodle (неизвестно мне), применил много изменений внутри каталога и выпустил ее ( здесь дерево ).

Как я могу определить, какая фиксация исходного проекта была, скорее всего, отредактирована, чтобы сформировать это дерево?

это позволило бы мне сформировать ветвь при соответствующей фиксации с этим патчем. Разумеется, это произошло из ветвей 1.8 или 1.9 , вероятно, из тега релиза, но разница между конкретными коммитами мне не очень помогает.

Postmortem Update: ответ 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; 

Было тысячи попыток прорваться, но этот, кажется, самый близкий матч.

    вы можете написать сценарий, который различает данное дерево от диапазона ревизий в вашем репозитории.

    предположим, что мы сначала получаем измененное дерево (без истории) в наш собственный repository:

     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 

    найдите фиксацию с наименьшим количеством изменений (или используйте какой-то механизм сортировки)

    Это было мое решение:

     #!/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. и 1.9 к этой новой версии. Тогда вы можете увидеть, какой патч имеет больше смысла.

    Например, если патч «удаляет» множество методов, то, вероятно, это не релиз, а первый. Если в патче есть много разделов, которые не имеют смысла как одно редактирование, то, вероятно, это тоже не релиз.

    И так далее … На самом деле, к сожалению, алгоритма для этого не существует. Мне нужно быть эвристическим.

    Как насчет использования «git wame»? Он покажет вам, для каждой строки, кто изменил ее и в какой версии.

    Interesting Posts

    Мелкозернистая конфигурация sudoers (допустимые аргументы командной строки)

    Как избежать установки файлов политики JCE «Неограниченная сила» при развертывании приложения?

    Установка 64-битной версии Windows 7 Ultimate упоминает недостающий драйвер CD / DVD?

    Как создать обработчик событий для программно созданного объекта в VB.NET?

    Как выполнять задачу Async повторно после фиксированных интервалов времени

    Как я могу собрать в массив?

    ASP.NET эквивалент серверной части включает

    Как обрабатываются пароли Windows?

    В чем разница между System.Type и System.RuntimeType в C #?

    Self-Terminating AWS EC2 Instance?

    как получить идентификатор электронной почты из facebook sdk в приложениях для Android?

    Формула Excel для среднесуточной прибыли

    Использование alloc init вместо нового

    Как использовать веб-службу WCF через URL-адрес во время выполнения?

    Как узнать, что у моей беспроводной карты включена инъекция?

    Давайте будем гением компьютера.