GitPython Можно ли получить файл из указанной фиксации без проверки

Я хочу скопировать файлы из указанной фиксации с помощью GitPython. Теперь я пришел сюда до сих пор:

import git
git = git.Git(REPO_PATH)
git.checkout(COMMIT_HEX_SHA)
fo = open(REPO_PATH + "/foo.txt", "r")
str = fo.read(10);
fo.close()

Оно работает. Но checkout меняет HEAD и меняет файлы. Можно ли копировать файлы или читать файлы из указанной фиксации без checkout?


person gzc    schedule 22.11.2015    source источник
comment
Должна быть возможность использовать получение большого двоичного объекта из любого коммита и чтение из него, например. git.Repo().commit(COMMIT_HEX_SHA).tree['subdir/somefile.ext'].data_stream.   -  person Byron    schedule 07.12.2015


Ответы (2)


комментарий Байрона действительно дает вам поток, но предостережение: если вы привыкли использовать with или .readlines() для чтения потоков, не пытайтесь использовать их здесь. Перейти на простой .read().

git.Repo().commit(COMMIT_HEX_SHA).tree['subdir/somefile.ext'].data_stream.read()

Если вам не нужен завершающий символ новой строки, вы также можете напрямую делегировать git show, как показано здесь:

git.Repo().git.show('{}:{}'.format(COMMIT_HEX_SHA, 'subdir/somefile.ext'))
person Michael    schedule 19.12.2018

Я бы посоветовал вам использовать PyDriller (внутренне использует GitPython). Это намного проще в использовании:

for commit in RepositoryMining("path_to_repo", single="commitHASH").traverse_commits():
    for modified_file in commit.modifications:
        # do whatever you want with the source code
        print(modified_file.source_code)
person Davide Spadini    schedule 08.02.2019