데이터베이스로서의 GitHub

13028 단어 githubgit
git은 실제로 데이터베이스입니다. GitHub는 git으로 구동되는 원격 데이터베이스입니다.

나중 분석을 위해 내 코드에서 중요한 특정 이벤트에 대한 정보를 멋지게 저장하는 방법이 필요했습니다. VCS에 커밋하는 것보다 더 좋은 것은 무엇일까요? 타임스탬프, 커밋 설명 등

로컬 git을 먼저 사용한 다음 GitHub로 전환했습니다. GitHub는 모든 기능에 대한 API를 제공합니다.

아래의 작은 코드는 이 접근 방식이 어떻게 작동하는지 보여줍니다.

GitHub account에서 생성할 수 있는 GITHUB_TOKEN과 리포지토리 이름이 있는 repo 변수의 두 가지를 설정해야 합니다.

새 파일을 만들어 파일을 만듭니다. 그런 다음 다시 업데이트하여 수정합니다. 그런 다음 파일을 삭제합니다.

리포지토리 로그는 이러한 모든 작업을 커밋 기록에 잘 보관합니다.

참고: PyGithub 패키지를 먼저 설치해야 합니다.

pip instal pygithub


암호:

import os
from typing import Optional, Union

import github
from github.Repository import Repository


def get_repo(repo: str) -> Repository:
    assert repo, 'repository name is missing'
    g = github.Github(os.environ['GITHUB_TOKEN'])
    return g.get_repo(repo)


def upsert_file(
    name: str,
    body: str,
    message: Optional[str] = None,
    *,
    repo: Optional[Union[Repository, str]] = None,
    branch: Optional[str] = "main",
    verbose: Optional[bool] = False,
):
    r = repo if isinstance(repo, Repository) else get_repo(repo)
    try:
        description_ = message or f'Update {name}'
        current = r.get_contents(name, ref=branch)
        current = r.update_file(
            current.path,
            description_,
            body,
            current.sha,
            branch=branch,
        )
        if verbose:
            print(current)
    except github.GithubException:
        message = message or f'Create {name}'
        created = r.create_file(name, message, body, branch=branch)
        if verbose:
            print(created)


def delete_file(
    name: str,
    message: str = None,
    *,
    repo: Optional[Union[Repository, str]] = None,
    branch: str = "main",
    verbose: Optional[bool] = False,
):
    r = repo if isinstance(repo, Repository) else get_repo(repo)
    message = message or f'Delete {name}'
    current = r.get_contents(name, ref=branch)
    deleted = r.delete_file(
        current.path,
        message,
        current.sha,
        branch=branch,
    )
    if verbose:
        print(deleted)


assert os.getenv('GITHUB_TOKEN'), 'Set GITHUB_TOKEN variable'

repo = "<YOUR_GITHUB_NAME>/<REPO_NAME>"

upsert_file("README.md", "NEW BODY", repo=repo, verbose=True)
upsert_file("README.md", "UPDATED BODY", repo=repo, verbose=True)

delete_file("README.md", repo=repo, verbose=True)


다음과 같이 실행하십시오.

python main.py


다음과 같이 인쇄됩니다.

{'content': ContentFile(path="README.md"), 'commit': Commit(sha="a6c540fec9b1b02e21acbb0ddd790efb6b7cb33f")}
{'commit': Commit(sha="2436e7ff2692a9af398dabd9eb9d1eee0f821954"), 'content': ContentFile(path="README.md")}
{'commit': Commit(sha="31fefb51e3510071777e4f4c8a0971de0a184f78"), 'content': NotSet}


GitHub 리포지토리로 이동하여 커밋을 확인합니다.

좋은 웹페이지 즐겨찾기