Как получить исходный код файлов в коммите с GitPython? - PullRequest
0 голосов
/ 18 июня 2019

Мне нужно получить исходные коды для всех файлов в коммите.В настоящее время я использую Pydriller, и он работает хорошо.Но из соображений производительности мне нужно использовать GitPython.Я пробовал это решение:

repo = Repo('path to repo') )
    commit = repo.commit('my hash')
with io.BytesIO(target_file.data_stream.read()) as f: 
    print(f.read().decode('utf-8'))

Но я получаю эту ошибку:

Traceback (most recent call last):
File "D:\Programmi\Python36\lib\threading.py", line 916, in _bootstrap_inner
    self.run()
File "D:\Programmi\Python36\lib\threading.py", line 864, in run
    self._target(*self._args, **self._kwargs)
File "D:/Workspaces/PythonProjects/fixing- 
    commit/crop_data_preparing_gitpython.py", line 82, in 
get_commit_data_gitpython
print(f.read().decode('utf-8'))
UnicodeDecodeError: 'utf-8' codec can't decode byte 0x9f in position 18: invalid start byte

Я думал, что это может быть проблема с кодировкой, но даже смена кодировки с utf-8to latin-1 не помогает.

Существует ли другая стратегия, которая помогла бы мне получить код для этих файлов, используя GitPython?

1 Ответ

0 голосов
/ 25 июня 2019

Как было сказано в первом комментарии, для этих вещей я бы предложил вам использовать PyDriller , это намного проще:

for commit in RepositoryMining("repo").traverse_commits():
    for modified_file in commit.modifications:
        modified_file.source_code

Он также заботится о декодировании, переименованиях и т. Д.У вас также есть исходный код перед фиксацией (modified_file.source_code_before)

...