LINUX.ORG.RU

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

 


0

1

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

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

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

★★★★★

Последнее исправление: xorik (всего исправлений: 1)

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

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

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

Значит нужно делать 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 ★★
()
Ответ на: комментарий от redbaron

Спасибо за идею, надо попробовать!

xorik ★★★★★
() автор топика

Про 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)

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

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