リポジトリを作成し、任意の Python パッケージを介していくつかのファイルをコミットしたいと考えています。私はどのように行いますか?
コミットするファイルを追加する方法がわかりません。
リポジトリを作成し、任意の Python パッケージを介していくつかのファイルをコミットしたいと考えています。私はどのように行いますか?
コミットするファイルを追加する方法がわかりません。
新しい更新GitHub CRUD API (2013 年 5 月)が役立つかどうかを確認できます。
リポジトリ コンテンツ APIでは、しばらくの間、ファイルの読み取りが許可されていました。Web UI と同じように、変更を単一のファイルに簡単にコミットできるようになりました。
本日より、次の方法をご利用いただけます。
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)
Github が提供するGit データベース APIを使用すると、生のオブジェクトの読み取りと書き込み、および参照 (ブランチ ヘッドとタグ) の一覧表示と更新を行うことができます。このトピックをよりよく理解するために、 Pro Git book のGit Internalsの章を読むことを強くお勧めします。
ドキュメントによると、リポジトリ内のファイルに変更をコミットするのは 7 ステップのプロセスです。
- 現在のコミット オブジェクトを取得する
- それが指しているツリーを取得する
- その特定のファイル パスに対してツリーが保持する BLOB オブジェクトのコンテンツを取得する
- 何らかの方法でコンテンツを変更し、その新しいコンテンツを含む新しい blob オブジェクトを投稿して、blob SHA を取得します
- そのファイル パス ポインターを新しいブロブ SHA に置き換えた新しいツリー オブジェクトを投稿し、ツリー SHA を取得します。
- 現在のコミット SHA を親として、新しいツリー SHA を使用して新しいコミット オブジェクトを作成し、コミット SHA を取得します。
- ブランチの参照を更新して、新しいコミット SHA を指すようにします
このブログでは、perl を使用してこのプロセスを説明しています。Python 実装の場合、PyGithubライブラリを使用できます。
前の回答に基づいて、ここに完全な例があります。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)
私はGoogle App Engine (GAE)を使用しているので、python のほかに、新しいファイルを作成し、更新し、コミットを介して削除し、php、java、および go でGitHub API v3を使用して GitHubのリポジトリにプッシュすることもできます。
perlで提示されたサンプルスクリプトのように作成するために利用可能なサードパーティのライブラリのいくつかを確認して確認すると、次を使用することをお勧めします。
お気づきのとおり、GitHub アカウントと組織ごとに 1 つのサイトを取得できます。また、ウェブサイトがレポから直接ホストされ、デフォルトでJekyllを利用する無制限のプロジェクト サイトを取得できます。
GAE でJekyll、Webhooks、および GitHub API Script を適切なGAE 設定と組み合わせることで、外部スクリプトを呼び出して GitHub で動的なページを作成するなど、幅広い可能性がもたらされます。
GAE 以外に、Heroku で実行するオプションもあります。(無料の) Heroku インスタンス上にあるJekyllBotを使用して、投稿ごとに JSON ファイルを静かに生成し、変更を GitHub にプッシュします。