Как узнать, с какого коммита пришел извлеченный файл - PullRequest
4 голосов
/ 05 августа 2011

Когда я извлекаю файл с git checkout $commit $filename и забываю $commit, но все еще помню $filename, как мне узнать, что было $commit?

Ответы [ 7 ]

2 голосов
/ 05 августа 2011

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

Ответ git.Обычно вы не можете найти THE $ commit.Как правило, одно и то же содержимое могло быть частью многих коммитов, и я не думаю, что git ведет журнал того, какой отдельный файл вы извлекли (он хранит журнал предыдущих значений HEAD)

Вот грубая ошибкаПринудительный скрипт git-find-by-content.Назовите его с вашим $ filename в качестве параметра, и он покажет вам все коммиты, где этот файл был включен.Как следует из названия, он ищет по содержанию.Так что он найдет файлы с любым именем, если их содержимое совпадает.

#! /bin/sh
tmpdir=/tmp/$(basename $0)
mkdir $tmpdir 2>/dev/null
rm  $tmpdir/* 2>/dev/null

hash=$(git hash-object $1)
echo "finding $hash"

allrevs=$(git rev-list --all)
# well, nearly all revs, we could still check the log if we have
# dangling commits and we could include the index to be perfect...

for rev in $allrevs
do
  git ls-tree --full-tree -r $rev >$tmpdir/$rev 
done

cd $tmpdir
grep $hash * 


rm -r $tmpdir

Я не удивлюсь, если найдется более элегантный способ, но это сработало для меня пару раз в подобномситуации.

РЕДАКТИРОВАТЬ: здесь появляется более техническая версия той же проблемы: Какой коммит имеет этот BLOB-объект?

1 голос
/ 05 августа 2011

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

Если это то, что вы делаете часто, вы можете написать скрипт, который мог бы сделать это, используя git diff --cached и пройти через все коммиты, которые изменили этот файл.

0 голосов
/ 08 января 2012
0 голосов
/ 06 октября 2011

Просто и элегантно:

$ git log -S"$(cat /path/to/file)"

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

Он также отображает только первая версия, которая соответствует, а не все.

0 голосов
/ 05 августа 2011

Попробуйте это (не проверено;):

$ for commit in $(git log --format=%h $filename); do
>  if diff <(git show $commit:$filename) $filename >/dev/null; then
>    echo $commit
>  fi
> done 
0 голосов
/ 05 августа 2011

Если вам повезет, вы можете попробовать не-мерзавец:

history | grep "git checkout.*filename"
0 голосов
/ 05 августа 2011

Вы можете использовать

git log <filename>

чтобы узнать, какой коммит вы хотите оформить

...