Как получить копию старой версии файла в репозитории git?

У меня есть версия файла .tex из нескольких коммитов, которые я хотел бы получить. У меня есть хэш-значение sha1 для коммита, у которого есть версия этого файла, который я хочу. Я не хочу заменять текущую версию файла. Скорее, я хочу просто получить отдельную копию, которая отражает его состояние в более старой версии.

Многие похожие вопросы предполагают использование git checkout <sha1> -- file.tex, но это просто продолжает давать "error: pathspec" file.tex "не соответствует ни одному файлу, известному как git."

Файл, который меня интересует, первоначально существовал в каталоге верхнего уровня репозитория. Я в настоящее время находится в подкаталоге репозитория, пытающегося запустить эту команду, чтобы получить более старую версию file.tex в подкаталоге.

Возможно ли это? Как я могу это сделать?

Ответ 1

Вы можете использовать git cat-file, чтобы выгрузить содержимое файла на стандартный вывод и перенаправить его в нужное место назначения:

git cat-file -p <sha1>:./file.tex > wherever.tex

./ необходим, если вы находитесь в подкаталоге репозитория, если вы находитесь на верхнем уровне хранилища, его можно опустить. Кроме того, это может не работать в более старых версиях git, и в этом случае вам нужно явно указать полный путь к файлу относительно корня репозитория.

Ответ 2

Я думаю, что лучшее решение - это временно перезаписать ваш файл. В вашем верхнем уровне вашего хранилища:

git checkout <sha1> file.tex
cp file.tex directory
git checkout HEAD file.tex

Ответ 3

Используйте git show с абсолютными путями в репозитории:

workdir$ git show revision:repo/module/package/code.file > code.file.old

или пути относительно текущего каталога:

package$ git show revision:./code.file > workdir/code.file.old

В отличие от извлечения файла, show по сути своей не меняет ваше рабочее пространство, вы можете делать с выводом все что угодно.

Сообщите этот ответ и, конечно же, ознакомьтесь с подробностями в руководстве.