34

リポジトリを作成し、任意の Python パッケージを介していくつかのファイルをコミットしたいと考えています。私はどのように行いますか?

コミットするファイルを追加する方法がわかりません。

4

7 に答える 7

17

新しい更新GitHub CRUD API (2013 年 5 月)が役立つかどうかを確認できます。

リポジトリ コンテンツ APIでは、しばらくの間、ファイルの読み取りが許可されていました。Web UI と同じように、変更を単一のファイルに簡単にコミットできるようになりました。

本日より、次の方法をご利用いただけます。

于 2013-05-07T06:25:04.040 に答える
16

Here is a complete snippet:

def push_to_github(filename, repo, branch, token):
    url="https://api.github.com/repos/"+repo+"/contents/"+filename

    base64content=base64.b64encode(open(filename,"rb").read())

    data = requests.get(url+'?ref='+branch, headers = {"Authorization": "token "+token}).json()
    sha = data['sha']

    if base64content.decode('utf-8')+"\n" != data['content']:
        message = json.dumps({"message":"update",
                            "branch": branch,
                            "content": base64content.decode("utf-8") ,
                            "sha": sha
                            })

        resp=requests.put(url, data = message, headers = {"Content-Type": "application/json", "Authorization": "token "+token})

        print(resp)
    else:
        print("nothing to update")

token = "lskdlfszezeirzoherkzjehrkzjrzerzer"
filename="foo.txt"
repo = "you/test"
branch="master"

push_to_github(filename, repo, branch, token)
于 2017-10-15T21:24:59.450 に答える
10

Github が提供するGit データベース APIを使用すると、生のオブジェクトの読み取りと書き込み、および参照 (ブランチ ヘッドとタグ) の一覧表示と更新を行うことができます。このトピックをよりよく理解するために、 Pro Git book のGit Internalsの章を読むことを強くお勧めします。

ドキュメントによると、リポジトリ内のファイルに変更をコミットするのは 7 ステップのプロセスです。

  1. 現在のコミット オブジェクトを取得する
  2. それが指しているツリーを取得する
  3. その特定のファイル パスに対してツリーが保持する BLOB オブジェクトのコンテンツを取得する
  4. 何らかの方法でコンテンツを変更し、その新しいコンテンツを含む新しい blob オブジェクトを投稿して、blob SHA を取得します
  5. そのファイル パス ポインターを新しいブロブ SHA に置き換えた新しいツリー オブジェクトを投稿し、ツリー SHA を取得します。
  6. 現在のコミット SHA を親として、新しいツリー SHA を使用して新しいコミット オブジェクトを作成し、コミット SHA を取得します。
  7. ブランチの参照を更新して、新しいコミット SHA を指すようにします

このブログでは、perl を使用してこのプロセスを説明しています。Python 実装の場合、PyGithubライブラリを使用できます。

于 2013-02-03T13:07:36.920 に答える
2

前の回答に基づいて、ここに完全な例があります。POSTコミットを新しいブランチにアップロードする場合、または既存のブランチにアップロードする場合に使用する必要があることに注意してくださいPATCH


    import whatsneeded
    
    GITHUB_TOKEN = "WHATEVERWILLBEWILLBE"
    
    def github_request(method, url, headers=None, data=None, params=None):
        """Execute a request to the GitHUB API, handling redirect"""
        if not headers:
            headers = {}
        headers.update({
            "User-Agent": "Agent 007",
            "Authorization": "Bearer " + GITHUB_TOKEN,
        })
    
        url_parsed = urllib.parse.urlparse(url)
        url_path = url_parsed.path
        if params:
            url_path += "?" + urllib.parse.urlencode(params)
    
        data = data and json.dumps(data)
        conn = http.client.HTTPSConnection(url_parsed.hostname)
        conn.request(method, url_path, body=data, headers=headers)
        response = conn.getresponse()
        if response.status == 302:
            return github_request(method, response.headers["Location"])
    
        if response.status >= 400:
            headers.pop('Authorization', None)
            raise Exception(
                f"Error: {response.status} - {json.loads(response.read())} - {method} - {url} - {data} - {headers}"
            )
    
        return (response, json.loads(response.read().decode()))
      
    def upload_to_github(repository, src, dst, author_name, author_email, git_message, branch="heads/master"):
        # Get last commit SHA of a branch
        resp, jeez = github_request("GET", f"/repos/{repository}/git/ref/{branch}")
        last_commit_sha = jeez["object"]["sha"]
        print("Last commit SHA: " + last_commit_sha)
    
        base64content = base64.b64encode(open(src, "rb").read())
        resp, jeez = github_request(
            "POST",
            f"/repos/{repository}/git/blobs",
            data={
                "content": base64content.decode(),
                "encoding": "base64"
            },
        )
        blob_content_sha = jeez["sha"]
    
        resp, jeez = github_request(
            "POST",
            f"/repos/{repository}/git/trees",
            data={
                "base_tree":
                last_commit_sha,
                "tree": [{
                    "path": dst,
                    "mode": "100644",
                    "type": "blob",
                    "sha": blob_content_sha,
                }],
            },
        )
        tree_sha = jeez["sha"]
    
        resp, jeez = github_request(
            "POST",
            f"/repos/{repository}/git/commits",
            data={
                "message": git_message,
                "author": {
                    "name": author_name,
                    "email": author_email,
                },
                "parents": [last_commit_sha],
                "tree": tree_sha,
            },
        )
        new_commit_sha = jeez["sha"]
    
        resp, jeez = github_request(
            "PATCH",
            f"/repos/{repository}/git/refs/{branch}",
            data={"sha": new_commit_sha},
        )
        return (resp, jeez)

于 2020-10-10T20:40:01.530 に答える
1

私はGoogle App Engine (GAE)を使用しているので、python のほかに、新しいファイルを作成し、更新し、コミットを介して削除し、php、java、および go でGitHub API v3を使用して GitHubのリポジトリにプッシュすることもできます。

perlで提示されたサンプルスクリプトのように作成するために利用可能なサードパーティのライブラリのいくつかを確認して確認すると、次を使用することをお勧めします。

お気づきのとおり、GitHub アカウントと組織ごとに 1 つのサイトを取得できます。また、ウェブサイトがレポから直接ホストされ、デフォルトでJekyllを利用する無制限のプロジェクト サイトを取得できます。

GAE でJekyllWebhooks、および GitHub API Script を適切なGAE 設定と組み合わせることで、外部スクリプトを呼び出して GitHub で動的なページを作成するなど、幅広い可能性がもたらされます。

GAE 以外に、Heroku で実行するオプションもあります。(無料の) Heroku インスタンス上にあるJekyllBotを使用して、投稿ごとに JSON ファイルを静かに生成し、変更を GitHub にプッシュします。

于 2016-05-11T14:26:07.953 に答える