GitPython을 가지고 뭔가 만들다가 에러를 만났다.


fetch()를 실행하는데, 뭔가가 맞지 않다고 에러라고 하는데... 아무리 살펴봐도 에러가 발생한 상황이 아닌데...
그래서 찾아봤는데 이는 GitPython이 최신 버전의 Git 과의 궁합에서 발생한 에러/버그 상황이다.

   https://github.com/gitpython-developers/GitPython/issues/142

해결 방법은 파일 수정이라고 한다.

$ sudo nano /usr/local/lib/python2.7/dist-packages/GitPython-0.3.2.RC1-py2.7.egg/git/remote.py

...
        def _get_fetch_info_from_stderr(self, proc, progress):
                # skip first line as it is some remote info we are not interested in
                output = IterableList('name')

                # lines which are no progress are fetch info lines
                # this also waits for the command to finish
                # Skip some progress lines that don't provide relevant information
                fetch_info_lines = list()
                for line in digest_process_messages(proc.stderr, progress):
                        if line.startswith('From') or line.startswith('remote: Total'):
                                continue
                        elif line.startswith('warning:'):
                                print >> sys.stderr, line
                                continue
...

위와 같은 코드를 아래와 같이 변경하면 된다고 한다.

...
        def _get_fetch_info_from_stderr(self, proc, progress):
                # skip first line as it is some remote info we are not interested in
                output = IterableList('name')

                # lines which are no progress are fetch info lines
                # this also waits for the command to finish
                # Skip some progress lines that don't provide relevant information
                fetch_info_lines = list()
                for line in digest_process_messages(proc.stderr, progress):
                        #if line.startswith('From') or line.startswith('remote: Total'):
                        if line.startswith('From') or line.startswith('remote: Total') \
                                or line.startswith('POST') or line.startswith(' ='):
                                continue
                        elif line.startswith('warning:'):
                                print >> sys.stderr, line
                                continue
...

그런데, 위와 같이 하여도 에러는 여전하였다.

Git을 다룬다는 것 자체도 좀 마이너하고, 특히나 GitPython을 다루는 분들이 많지 않고...
자료를 찾기가 너무 어려워서 다시 원점으로 돌아가서 현재 개발중인 코드를 살펴보다가 답을 찾았다.

...
                # read head information
                fp = open(join(self.repo.git_dir, 'FETCH_HEAD'),'r')
                fetch_head_info = fp.readlines()
                fp.close()

                assert len(fetch_info_lines) == len(fetch_head_info), "len(%s) != len(%s)" % (fetch_head_info, fetch_info_lines)

                output.extend(FetchInfo._from_line(self.repo, err_line, fetch_line)
                                                for err_line,fetch_line in zip(fetch_info_lines, fetch_head_info))

                finalize_process(proc)
                return output
...

에러메시지를 출력하는 부분이 위와 같이 있는데, 그냥 확 주석처리해버리면 된다.

...
        # read head information
        fp = open(join(self.repo.git_dir, 'FETCH_HEAD'),'r')
        fetch_head_info = fp.readlines()
        fp.close()
       
        # NOTE: HACK Just disabling this line will make github repositories work much better.
        # I simply couldn't stand it anymore, so here is the quick and dirty fix ... .
        # This project needs a lot of work !
        # assert len(fetch_info_lines) == len(fetch_head_info), "len(%s) != len(%s)" % (fetch_head_info, fetch_info_lines)
       
        output.extend(FetchInfo._from_line(self.repo, err_line, fetch_line)
                        for err_line,fetch_line in zip(fetch_info_lines, fetch_head_info))
...

프로젝트 담당자도 인정했다시피 이렇게 주석처리하는 것이 정석은 아니다.
여력이 되시는 분은 이 부분에 대해서 도움을 주면 좋을 것 같다.


뭐 여하튼... 문제 해결!!!

반응형

+ Recent posts