Pygithub: InputGitTreeElement рдХреЛ sha . рдХреЗ рд▓рд┐рдП "рдирд▓" рдкрд╛рд╕ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреА рдЪрд╛рд╣рд┐рдП

рдХреЛ рдирд┐рд░реНрдорд┐рдд 14 рджрд┐рд╕ре░ 2019  ┬╖  8рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: PyGithub/PyGithub

рдЧрд┐рдердм рдХрд╛ рдЯреНрд░реА рдирд┐рд░реНрдорд╛рдг рдПрдкреАрдЖрдИ рд╣рдореЗрдВ рдпрд╣ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП 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 ред рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд╣рд░ рдЬрдЧрд╣ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬреАрдПрдЪ рдПрдкреАрдЖрдИ рдПрдХ рд╢реВрдиреНрдп рдорд╛рди рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИред

рдЙрджрд╛рд╣рд░рдг

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


рдореЗрд░рд╛ рд╡рд░реНрддрдорд╛рди рдХрд╛рдордХрд╛рдЬ рдкреЗрдбрд╝ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдкреАрдЖрдИ рдХреЛ рд╕реАрдзреЗ рд╣рд┐рдЯ рдХрд░рдирд╛ рд╣реИ (рдЕрдиреБрд░реЛрдзреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, sha=None ), рдкреЗрдбрд╝ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ рдФрд░ рдЗрд╕реЗ рдореЗрд░реЗ рд╢реЗрд╖ рд╡рд░реНрдХрдлрд╝реНрд▓реЛ (рдкреНрд░рддрд┐рдмрджреНрдзрддрд╛, рдЖрджрд┐) рдХреЗ рд▓рд┐рдП рдкрд╛рдпрдЬреАрдердм рдХреЗ рд╕рд╛рде рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред

рдХреГрдкрдпрд╛ рдореБрдЭреЗ рдмрддрд╛рдПрдВ рдХрд┐ рдХреНрдпрд╛ рдореИрдВрдиреЗ рдХреБрдЫ рдкрд╣рд▓реВ рдХреЛ рдЧрд▓рдд рд╕рдордЭрд╛ рд╣реИ рдпрд╛ рдпрджрд┐ рдХреБрдЫ рднреА рд╡рд┐рд╕реНрддреГрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

рдмрд╣реБрдд рдмрд╣реБрдд рдзрдиреНрдпрд╡рд╛рдж! рдореИрдВ рдЗрд╕реЗ рдЕрдЧрд▓реЗ рджрд┐рди рдпрд╛ рддреЛ рдХреЛрд╢рд┐рд╢ рдХрд░реВрдБрдЧрд╛ред рд╢рд╛рдпрдж рдПрдл-рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдХреЗ рдмрд┐рдирд╛ред :-)

рд╕рднреА 8 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ NotSet рдЕрдкрдиреЗ рдЖрдк рдореЗрдВ рдПрдХ рд╡рд░реНрдЧ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдХрд┐рд╕реА рд╕реЗ рдХреЛрдИ рд▓реЗрдирд╛-рджреЗрдирд╛ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрджрд┐ рдЖрдк рдХрд┐рд╕реА рдореЗрдВ рднреА рдкрд╛рд╕ рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВ, рддреЛ рдЗрд╕реЗ рдареАрдХ рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП ред

рдУрд╣, рд░реБрдХреЛ, рдореИрдВ рджреЗрдЦрддрд╛ рд╣реВрдБред рд╣рдо рджрд╛рд╡рд╛ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдПрдХ str рд╣реИ! рдареАрдХ рд╣реИ, рдареАрдХ рд╣реИ, рддреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХрд┐рд╕реА рдХреЛ рднреА рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдвреАрд▓рд╛ рд╣реЛрдирд╛ рдмрд┐рд▓реНрдХреБрд▓ рдареАрдХ рдирд╣реАрдВ рд╣реИ, рдЕрдЪреНрдЫреА рдкрдХрдбрд╝ред

рдореБрдЭреЗ рдЗрд╕ рдмрджрд▓рд╛рд╡ рд╕реЗ рдмрд╣реБрдд рдкрд░реЗрд╢рд╛рдиреА рд╣реЛ рд░рд╣реА рд╣реИред рдореИрдВрдиреЗ рдЖрд╡рд╢реНрдпрдХ рдкрд░рд┐рд╡рд░реНрддрди рдХрд┐рдП рд╣реИрдВ, рд▓реЗрдХрд┐рди 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)

1 рдХрд╛рд░рдг рдореБрдЭреЗ рднреА 422 GitRPC::BadObjectState рд╣реБрдЖ рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ paths рдореЗрдВ рдлрд╝рд╛рдЗрд▓ рдирд╛рдореЛрдВ рдХреА рдЖрдкреВрд░реНрддрд┐ рдХрд░ рд░рд╣рд╛ рдерд╛ рдЬреЛ рдХрд┐ рдмреЗрд╕ рдЯреНрд░реА рдореЗрдВ рдореМрдЬреВрдж рдирд╣реАрдВ рдерд╛ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдКрдкрд░ рджрд┐рдП рдЧрдП рдлрд╝рд╛рдЗрд▓ рдирд╛рдореЛрдВ рдореЗрдВ рд╕реЗ 1 рдХреЛ рджреВрд╖рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВред

рдореИрдВ рдЕрдкрдирд╛ рдкрд░реАрдХреНрд╖рдг рд░реЗрдкреЛ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛, рд▓реЗрдХрд┐рди рдпрд╣рд╛рдБ рд╕рдВрд░рдЪрдирд╛ рд╣реИ, рдмрд╕ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рд░реЗрдкреЛ рдореЗрдВ рдбрдореА рдлрд╝рд╛рдЗрд▓реЗрдВ рд╕реЗрдЯрдЕрдк рдХрд░реЗрдВ

pods/
  raghav/
    network/
      resources.tf

рдмрд╣реБрдд рдмрд╣реБрдд рдзрдиреНрдпрд╡рд╛рдж! рдореИрдВ рдЗрд╕реЗ рдЕрдЧрд▓реЗ рджрд┐рди рдпрд╛ рддреЛ рдХреЛрд╢рд┐рд╢ рдХрд░реВрдБрдЧрд╛ред рд╢рд╛рдпрдж рдПрдл-рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдХреЗ рдмрд┐рдирд╛ред :-)

@stevenk рд╡реЛрд╣реВ! рдЗрд╕реЗ рдареАрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж
рд╕реАрд╕реА @rohitpaulk

@stevenk рдореИрдВ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдПрдХ рдХрдорд┐рдЯ рдмрдирд╛ рд░рд╣рд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рддрдм рднреА рд╣реЛрддрд╛ рд╣реИ рдЬрдм рдлрд╝рд╛рдЗрд▓ рднрд┐рдиреНрди рд╢реВрдиреНрдп рд╣реЛред рдХреГрдкрдпрд╛, рдХреБрдЫ рдЕрдВрддрд░ рд╣реЛрдиреЗ рдкрд░ рд╣реА рдХреИрд╕реЗ рдХрдорд┐рдЯ рдХрд░реЗрдВ, рдЗрд╕ рдкрд░ рдХреЛрдИ рдорджрдж рдХрд░реЗрдВред рдзрдиреНрдпрд╡рд╛рдж !

   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])

@ рдЕрднрд┐рд╖реЗрдХ 627 рдЯреНрд░реА рдПрд╕рдПрдЪрдП рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рдЖрдкрдХреЗ рднрдВрдбрд╛рд░ рдореЗрдВ рд╕рднреА рдлрд╛рдЗрд▓реЛрдВ рдХреЗ рдЪреЗрдХрд╕рдо рд╣реИрдВ, рддрд╛рдХрд┐ рдЖрдк рдЬрд╛рдВрдЪ рд╕рдХреЗрдВ рдХрд┐ рд╡реЗ рдореЗрд▓ рдЦрд╛рддреЗ рд╣реИрдВ рдпрд╛ рдирд╣реАрдВред

рдЖрдкрдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ, рдпрд╣ рдХреБрдЫ рдРрд╕рд╛ рд╣реЛрдЧрд╛:

if tree.sha != base_tree.sha:
   # then commit

(рдореБрдЭреЗ рдпрд╛рдж рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╢рд╛ рд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рд╕ рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдкрдХреЛ рдЗрд╕рдХрд╛ рдЕрдВрджрд╛рдЬрд╛ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ)

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

surajjacob picture surajjacob  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

rthill91 picture rthill91  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

Borkason picture Borkason  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

lwasser picture lwasser  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

xpdable picture xpdable  ┬╖  5рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ