LINUX.ORG.RU

Найти коммит, в котором находится working tree после удаления .git

 


0

1

Например есть исходники n-месячной давности, но без каталога .git.

Можно ли найти коммит, в котором находятся эти файлы (после копирования свежей истории) или придется писать скрипт, который будет делать git diff с каждым коммитом?

Нагуглить ничего не смог

★★★★★

Надо подумать. В sha находится что? Точнее sha зависит от чего?

crutch_master ★★★★★ ()
Ответ на: комментарий от crutch_master

sha не поможет, там данные коммита, а не только дерево

xorik ★★★★★ ()

git bisect + git diff с использование "--work-tree"

maxcom ★★★★★ ()
Ответ на: комментарий от maxcom

bisect не поможет, только линейный поиск, ибо тут ответ можно дать только равно/не равно, а не больше/меньше.

s9gf4ult ★★ ()
Ответ на: комментарий от s9gf4ult

Значит нужно делать diff дерева с каждым коммитом.
Мне почему-то кажется, что я где-то читал, что есть готовая команда для моей задачи :)

xorik ★★★★★ ()
Ответ на: комментарий от s9gf4ult

Я бы попробовал bisect потому что, имхо, со временем изменения ,обычно, только накапливаются.

true_admin ★★★★★ ()
Ответ на: комментарий от true_admin

Bisect-ом смотреть размер diff-а? Ну в принципе хорошая идея, надо попробовать

xorik ★★★★★ ()
Ответ на: комментарий от xorik

Только не очень понятно, как алгоритм делать, допустим последний коммит в истории good, первый bad, он выбирает коммит посередине, как определить good он или не очень?

xorik ★★★★★ ()
Ответ на: комментарий от xorik

Никак. Для того чтобы определиться в каком направлении двигаться тебе нужно два коммита. По ним будет понятно в каком направлении нужно двигаться. Короче, тебе нужно найти http://ru.wikipedia.org/wiki/Градиент

true_admin ★★★★★ ()
Ответ на: комментарий от true_admin

Ну да, это будет оптимальным. Из простых вариантов только пройтись по всем коммитам и найти минимальный diff

xorik ★★★★★ ()

Если точно известно, что файлы те же самые, то можно сделать так:

1) сначала добавляем их в индекс git update-index --add

2) затем git write-tree таким образом оно создаст tree объект со всеми нашими файлами и выведет его hash

3) git log --all --pretty=format:'%T %h %s' |grep <hash из предыдущего>

т.е идея в том, чтобы создать tree точно такой же tree, узнать его хэш и поискать коммиты, которые ссылаются на это дерево

redbaron ★★ ()

Про bisect вообще забудьте - размер диффа изменяется в зависимости от удаления от эталонного коммита немонотонно. Хватит простого скрипта типа:

while git checkout HEAD^; do
  echo -n `git rev-parse HEAD`
  diff -ruN -x .git . /path/to/tree | wc -l
done

и смотрите насколько далеко от нуля блуждает дифф. Если 0 не найдётся, смотрите тот diff что был минимальным, возможно ещё какие-то -x нужны. Я так как-то успешно проставил тэги релизов имея только тарболлы этих релизов.

Из минусов - не умеет нелинейную историю.

slovazap ★★★★★ ()
Последнее исправление: slovazap (всего исправлений: 1)
Ответ на: комментарий от slovazap

Спасибо, то что надо! У меня линейная история

xorik ★★★★★ ()

В Git есть не только коммиты (commit), но и деревья (tree). SHA1 для дерева можно посчитать из файлов, а потом найти коммит, держащий дерево с таким SHA1.

aspotashev ★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.