Pygithub: InputGitTreeElement๋Š” sha์— ๋Œ€ํ•ด "null" ์ „๋‹ฌ์„ ํ—ˆ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์— ๋งŒ๋“  2019๋…„ 12์›” 14์ผ  ยท  8์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: PyGithub/PyGithub

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์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ œ๊ฐ€ ์ž˜๋ชป ์ดํ•ดํ•œ ๋ถ€๋ถ„์ด ์žˆ๊ฑฐ๋‚˜ ์ž์„ธํžˆ ์„ค๋ช…ํ•ด์•ผ ํ•  ๋ถ€๋ถ„์ด ์žˆ์œผ๋ฉด ์•Œ๋ ค์ฃผ์„ธ์š”.

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

์ •๋ง ๊ณ ๋งˆ์›Œ! ๋‹ค์Œ ๋‚  ์ •๋„์— ์‹œ๋„ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์•„๋งˆ๋„ f-์ŠคํŠธ๋ง์ด ์—†์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. :-)

๋ชจ๋“  8 ๋Œ“๊ธ€

์‹ค์ œ๋กœ 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

(์ƒค๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๋ฐ ์‚ฌ์šฉ๋œ ์ •ํ™•ํ•œ ๋ฐฉ๋ฒ•์€ ๊ธฐ์–ต๋‚˜์ง€ ์•Š์ง€๋งŒ ์•„์ด๋””์–ด๋Š” ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค)

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰