Как сохранить все git версии файла на диск? - PullRequest
2 голосов
/ 02 марта 2020

Наличие file.py с тремя версиями в git с тремя уникальными хэшами коммитов.

Так как я могу программно восстановить все версии в указанные c файлы, такие как:

0_<git_hash>_file.py
1_<git_hash>_file.py
2_<git_hash>_file.py

Решение не обязательно должно быть Python, но, глядя на Python git пакет на данный момент.

Ответы [ 3 ]

2 голосов
/ 02 марта 2020
n=0
git log --pretty= --diff-filter=d --raw -- $file | 
while read m1 m2 h1 h2 rest; do
        eval git show $h2 > $((n++))_${h2}.$file
done

или

n=0
git log --pretty=%h --diff-filter=d -- $file |
while read; do
        eval git show $REPLY:$file > $((n++))_$REPLY.$file
done

в зависимости от того, хотите ли вы, чтобы BLOB-объект или коммит имели sh в полученном имени файла.

0 голосов
/ 02 марта 2020

Используйте git rev-list для получения списка коммитов и git show для вывода файла:

i=0; git rev-list --abbrev-commit HEAD | 
while read sha; do
    git show $sha:./file.py > $((i++))_${sha}_file.py
done

Эта версия может избежать проблем при выполнении i++ в подоболочке и не влияет на родителя:

i=0; git rev-list --abbrev-commit HEAD |
while read sha; do
    git show $sha:./file.py > ${i}_${sha}_file.py
    ((i++))
done
0 голосов
/ 02 марта 2020

Вы можете получить указанную версию файла без проверки соответствующего коммита, используя git show. Например:

git show git_hash:./file.py

напечатает содержимое file.py с указанной фиксации для стандартного вывода. (Предположительно, интерфейс Git Python, который я не использовал, обеспечивает аналогичную функциональность.) В некоторых случаях ведущий ./ избегает проблем с разрешением пути (я не помню деталей).

Я написал Perl скрипт, который выполняет подобные действия для нескольких разных систем контроля версий (большинство из которых я больше не использую): https://github.com/Keith-S-Thompson/get-versions (без гарантий).

По запросу, вот пример запуска get-versions для копии собственного репо:

$ ls -l
total 56
-rw-r--r-- 1 kst kst 18092 Aug  9  2015 COPYING
-rw-r--r-- 1 kst kst  6234 Apr 16  2018 README.md
-rw-r--r-- 1 kst kst   940 Apr 25  2018 TODO.md
-rwxr-xr-x 1 kst kst 20977 Apr 16  2018 get-versions
$ get-versions -pad 3 -last 3 get-versions 
$ ls -l
total 128
-rw-r--r-- 1 kst kst 18092 Aug  9  2015 COPYING
-rw-r--r-- 1 kst kst  6234 Apr 16  2018 README.md
-rw-r--r-- 1 kst kst   940 Apr 25  2018 TODO.md
-rwxr-xr-x 1 kst kst 20977 Apr 16  2018 get-versions
-r--r--r-- 1 kst kst 20752 Mar  2 10:54 get-versions,012
-r--r--r-- 1 kst kst 20766 Mar  2 10:54 get-versions,013
-r--r--r-- 1 kst kst 20977 Mar  2 10:54 get-versions,014
$ 

get-versions -help печатает слишком подробное сообщение об использовании. (Добавление man-страницы в мой список TODO, как и сохранение прав на выполнение.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...