Github์ ํธ๋ฆฌ ์์ฑ API๋ฅผ ์ฌ์ฉํ๋ฉด ์ง์ ๋ blob์ ์ญ์ ํด์ผ ํจ์ ๋ํ๋ด๊ธฐ ์ํด sha = null
๋ฅผ ์ ๋ฌํ ์ ์์ต๋๋ค.
๊ทธ๋ฌ๋ ์ด ์ ๋ณด๋ฅผ ๋ด InputGitTreeElement
์ ์ ๋ฌํ ๋ฐฉ๋ฒ์ด ์์ต๋๋ค. str ๋๋ github.GithubObject.NotSet
์์ต๋๋ค. ์ด๊ฒ์ PyGithub์ ์ฌ์ฉํ์ฌ ํธ๋ฆฌ์์ ํ์ผ์ ์ญ์ ํ ๋ฐฉ๋ฒ์ด ์๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค(ํ ๋ฒ์ ์ปค๋ฐ์ผ๋ก ์ฌ๋ฌ ํ์ผ์ ์ญ์ ํ๊ณ ์ถ์ต๋๋ค. ๊ทธ๋์ ํธ๋ฆฌ ์์ฑ์ด ์ ์๊ฒ ์ด์์ ์ธ ์ ํ์
๋๋ค).
ํ์ฌ ๋์์ธ์ ์ค์ ๋ก ์ค์ ๋ ๊ฒฝ์ฐ์๋ง sha
ํ๋ ๊ฒ์
๋๋ค.
https://github.com/PyGithub/PyGithub/blob/540a085001/github/InputGitTreeElement.py#L81
None
๋ฅผ ์ ๋ฌํ๋ ๊ฒ์ ๋์์ธ์ ์ด๊ธ๋๋ค๋ ๊ฒ์ ์ดํดํ ์ ์์ต๋๋ค. github.GithubObject.Null
์ ๊ฐ์ ๊ฒ์ ๋์
ํ์ฌ ์ด ํ๋๊ฐ null
๋ผ๊ณ ๋ช
์์ ์ผ๋ก ๋งํ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. GH API๊ฐ null ๊ฐ์ ํ์ฉํ๋ ๋ชจ๋ ๊ณณ์์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
์์
new_tree = repo.create_git_tree(
[
InputGitTreeElement(
path="my/dir/my_file.txt", mode="100644", type="blob", sha=github.GithubObject.Null
),
],
base_tree=head_commit.tree
)
my/dir/my_file.txt
์ด ์ญ์ ๋ฉ๋๋ค.
ํ์ฌ ํด๊ฒฐ ๋ฐฉ๋ฒ์ API๋ฅผ ์ง์ ์คํํ์ฌ ํธ๋ฆฌ๋ฅผ ์์ฑํ๊ณ (์์ฒญ ์ฌ์ฉ, sha=None
), ํธ๋ฆฌ ์ค๋ฅผ ๊ฐ์ ธ์์ ๋๋จธ์ง ์ํฌํ๋ก(์ปค๋ฐ ๋ฑ)์ pygithub์ ํจ๊ป ์ฌ์ฉํ๋ ๊ฒ์
๋๋ค.
์ ๊ฐ ์๋ชป ์ดํดํ ๋ถ๋ถ์ด ์๊ฑฐ๋ ์์ธํ ์ค๋ช ํด์ผ ํ ๋ถ๋ถ์ด ์์ผ๋ฉด ์๋ ค์ฃผ์ธ์.
์ค์ ๋ก NotSet์ None๊ณผ ์๋ฌด ๊ด๋ จ์ด ์๋ ํด๋์ค์ด๋ฏ๋ก None์ ์ ๋ฌ ํ๋ฉด ์ ๋๋ก ์๋ํฉ๋๋ค.
์ค, ์ ๊น, ์๊ฒ ์ต๋๋ค. ์ฐ๋ฆฌ๋ ๊ทธ๊ฒ์ด str์ด๋ผ๊ณ ์ฃผ์ฅํฉ๋๋ค! ์ข์์, ์ข์์, ๊ทธ๋์ None์ ํ์ฉํ๊ธฐ ์ํด ๋์จํ๊ฒ ํ๋ ๊ฒ์ด ์๋ฒฝํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ข์ ์บ์น์ ๋๋ค.
์ด ๋ณ๊ฒฝ์ผ๋ก ์ธํด ๋ง์ ์ด๋ ค์์ ๊ฒช๊ณ ์์ต๋๋ค. ํ์ํ ๋ณ๊ฒฝ์ ์ํํ์ง๋ง create_git_tree() API๊ฐ 422 GitRPC::BadObjectState ๋๋ ์ผ๋ฐ 404 Not Found ์ค๋ฅ๋ฅผ ๋ฐํํฉ๋๋ค. ๋จ์ ํ ์คํธ๋ฅผ ์ํ ์ฌ์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ฌ ์ ์๋๋ก ๊ณต๊ฐ ๋ฆฌํฌ์งํ ๋ฆฌ์ ๋ํ ์์ ์์ ๋ฅผ ์ ๊ณตํ ์ ์์ต๋๊น?
๋ด ์ฝ๋๋ ๋น๊ณต๊ฐ ๋ฆฌํฌ์งํ ๋ฆฌ์ด๋ฏ๋ก ์ฌ๊ธฐ์์ ์ ๊ฑฐ๋ ๋ฒ์ ์ ๋ง๋ค์์ต๋๋ค.
import json
import requests
from http import HTTPStatus
from github import Github
TOKEN = "<GITHUB TOKEN>"
gh_client = Github(TOKEN)
repo = gh_client.get_repo("duaraghav8/test")
my_branch = "tree-test"
# paths is list of files to delete
paths = ["pods/raghav/network/resources.tf", "abc"]
sha = repo.get_branch(my_branch).commit.sha
head_commit = repo.get_git_commit(sha)
tree_objects = [
{"path": path, "mode": "100644", "type": "blob", "sha": None}
for path in paths
]
payload = {
"base_tree": head_commit.tree.sha,
"tree": tree_objects,
}
headers = {"Authorization": f"token {TOKEN}"}
url = f"{repo.url}/git/trees"
response = requests.post(url, headers=headers, data=json.dumps(payload))
if response.status_code != HTTPStatus.CREATED:
raise RuntimeError("Failed")
new_tree_sha = response.json()["sha"]
tree = repo.get_git_tree(new_tree_sha)
๋ด๊ฐ 422 GitRPC::BadObjectState
์ ๋ฐ์ ์ด์ ์ค ํ๋๋ ๊ธฐ๋ณธ ํธ๋ฆฌ์ ์๋ paths
ํ์ผ ์ด๋ฆ์ ์ ๊ณตํ๊ธฐ ๋๋ฌธ์
๋๋ค. ์๋ฅผ ๋ค์ด, ์์ ํ์ผ ์ด๋ฆ ์ค ํ๋๋ฅผ ์์์ํค์ญ์์ค.
๋ด ํ ์คํธ ๋ฆฌํฌ์งํ ๋ฆฌ๋ฅผ ๊ณต๊ฐํ ์๋ ์์ง๋ง ์ฌ๊ธฐ์ ๊ตฌ์กฐ๊ฐ ์์ต๋๋ค. ์์ ์ ๋ฆฌํฌ์งํ ๋ฆฌ์ ๋๋ฏธ ํ์ผ์ ์ค์ ํ๊ธฐ๋ง ํ๋ฉด ๋ฉ๋๋ค.
pods/
raghav/
network/
resources.tf
์ ๋ง ๊ณ ๋ง์! ๋ค์ ๋ ์ ๋์ ์๋ํด ๋ณด๊ฒ ์ต๋๋ค. ์๋ง๋ f-์คํธ๋ง์ด ์์ ์๋ ์์ต๋๋ค. :-)
@stevenk ์์ฐ! ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํด ์ฃผ์
์ ๊ฐ์ฌํฉ๋๋ค.
cc @rohitpaulk
@stevenk ์ด๋ฐ ์ปค๋ฐ์ ๋ง๋ค๊ณ ์๋๋ฐ, ํ์ผ diff๊ฐ 0์ธ ๊ฒฝ์ฐ์๋ ์ปค๋ฐ๋ฉ๋๋ค. diff ๊ฐ ์๋ ๊ฒฝ์ฐ์๋ง ์ปค๋ฐํ๋ ๋ฐฉ๋ฒ์ ๋ํ ๋์์ ์ฃผ์ธ์. ๊ฐ์ฌ ํด์ !
file_list = [a.txt]
file_names =[a.txt]
for i, entry in enumerate(file_list):
with open(entry) as input_file:
data = input_file.read()
element = InputGitTreeElement(file_names[i], '100644', 'blob', data)
element_list.append(element)
tree = repo.create_git_tree(element_list, base_tree)
parent = repo.get_git_commit(master_sha)
commit = repo.create_git_commit(commit_message, tree, [parent])
@Abhishek627 ํธ๋ฆฌ SHA๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ ์ฅ์์ ์๋ ๋ชจ๋ ํ์ผ์ ์ฒดํฌ์ฌ์ด๋ฏ๋ก ์ผ์นํ๋์ง ํ์ธํ ์ ์์ต๋๋ค.
๊ทํ์ ๋งฅ๋ฝ์์ ๊ทธ๊ฒ์ ๋ค์๊ณผ ๊ฐ์ ๊ฒ์ ๋๋ค.
if tree.sha != base_tree.sha:
# then commit
(์ค๋ฅผ ๊ฐ์ ธ์ค๋ ๋ฐ ์ฌ์ฉ๋ ์ ํํ ๋ฐฉ๋ฒ์ ๊ธฐ์ต๋์ง ์์ง๋ง ์์ด๋์ด๋ ์ ์ ์์ต๋๋ค)
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
์ ๋ง ๊ณ ๋ง์! ๋ค์ ๋ ์ ๋์ ์๋ํด ๋ณด๊ฒ ์ต๋๋ค. ์๋ง๋ f-์คํธ๋ง์ด ์์ ์๋ ์์ต๋๋ค. :-)