Api pembuatan Pohon Github memungkinkan kita meneruskan sha = null
untuk menunjukkan bahwa blob yang ditentukan perlu dihapus.
Namun, saya tidak memiliki cara untuk meneruskan info ini ke InputGitTreeElement
. Saya bisa memberikannya str atau github.GithubObject.NotSet
. Ini berarti saya tidak memiliki cara untuk menghapus file dari pohon menggunakan PyGithub (Saya ingin menghapus banyak file dalam satu komit sehingga pembuatan pohon adalah pilihan ideal bagi saya).
Desain saat ini hanya meneruskan sha
jika benar-benar disetel:
https://github.com/PyGithub/PyGithub/blob/540a085001/github/InputGitTreeElement.py#L81
Saya dapat memahami bahwa memberikan None
bertentangan dengan desain. Saya pikir sesuatu seperti github.GithubObject.Null
dapat diperkenalkan untuk secara eksplisit mengatakan bahwa bidang ini adalah null
. Ini dapat digunakan di mana saja GH API menerima nilai nol.
Contoh
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
)
Ini akan menghapus my/dir/my_file.txt
Solusi saya saat ini adalah dengan langsung menekan api untuk membuat pohon (menggunakan permintaan, mengatur sha=None
), dapatkan pohon sha & gunakan dengan pygithub untuk alur kerja saya yang tersisa (melakukan, dll).
Tolong beri tahu saya jika saya salah memahami beberapa aspek atau jika ada yang perlu dijelaskan.
Sebenarnya NotSet adalah kelas tersendiri yang tidak ada hubungannya dengan None, jadi jika Anda memasukkan None, itu akan berfungsi dengan baik.
Oh, tunggu, aku mengerti. Kami menegaskan itu adalah str! Benar, oke, jadi saya pikir melonggarkan untuk mengizinkan None baik-baik saja, tangkapan yang bagus.
Saya mengalami banyak masalah dengan perubahan ini. Saya telah membuat perubahan yang diperlukan, tetapi create_git_tree() API mengembalikan 422 GitRPC::BadObjectState atau kesalahan 404 Not Found generik. Apakah Anda dapat memberikan contoh kerja terhadap repo publik sehingga saya dapat mengambil data replay untuk unit test?
Kode saya untuk repo pribadi, jadi saya baru saja membuat versi sederhananya untuk Anda di sini:
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 alasan saya juga menerima 422 GitRPC::BadObjectState
adalah karena saya menyediakan nama file di paths
yang tidak ada di pohon dasar. Misalnya, coba rusak 1 nama file di atas.
Saya tidak dapat membuat repo pengujian saya menjadi publik, tetapi inilah strukturnya, cukup atur file dummy di repo Anda sendiri
pods/
raghav/
network/
resources.tf
Terima kasih banyak! Saya akan mencoba ini di hari berikutnya atau lebih. Mungkin tanpa f-string. :-)
@stevenk wooo! terima kasih telah memperbaiki ini
cc @rohitpaulk
@stevenk Saya membuat komit seperti ini, tetapi ini komit meskipun perbedaan file nol. Tolong, bantuan apa pun tentang cara melakukan hanya jika ada beberapa diff . Terima kasih !
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 Tree SHA pada dasarnya adalah checksum dari semua file di repositori Anda, jadi Anda bisa memeriksa apakah mereka cocok.
Dalam konteks Anda, itu akan menjadi seperti:
if tree.sha != base_tree.sha:
# then commit
(Saya tidak ingat metode persis yang digunakan untuk mengambil sha, tetapi Anda mendapatkan idenya)
Komentar yang paling membantu
Terima kasih banyak! Saya akan mencoba ini di hari berikutnya atau lebih. Mungkin tanpa f-string. :-)