Ruby 从GitHub API中删除多个文件

Ruby 从GitHub API中删除多个文件,ruby,github-api,Ruby,Github Api,我正在尝试使用octokit.rb从几个子目录中删除多个文件-要清楚,我真正想做的是完全删除一些子目录。如果有更好的方法(在一次提交中)请为我指出正确的方向。在创建'foo'目录及其文件时,我有一个这样的工作示例,但是删除该目录会给我带来问题。这是我的代码,使用octokit: client = Octokit::Client.new(...) repo = 'dudo/k8s_colors' namespace = 'foo' ref = 'heads/master' sha_latest_

我正在尝试使用octokit.rb从几个子目录中删除多个文件-要清楚,我真正想做的是完全删除一些子目录。如果有更好的方法(在一次提交中)请为我指出正确的方向。在创建'foo'目录及其文件时,我有一个这样的工作示例,但是删除该目录会给我带来问题。这是我的代码,使用octokit:

client = Octokit::Client.new(...)
repo = 'dudo/k8s_colors'
namespace = 'foo'

ref = 'heads/master'
sha_latest_commit = client.ref(repo, ref).object.sha

sha_base_tree = client.commit(repo, sha_latest_commit).commit.tree.sha
base_tree = client.tree(repo, sha_base_tree, recursive: true)
clean_tree = base_tree.tree.select { |o| o.type == 'blob' && !o.path.include?("overlays/#{namespace}") }
                           .map { |o| o.to_h.slice(:path, :mode, :type, :sha) }
sha_new_tree = client.create_tree(repo, clean_tree).sha # TODO: this doesn't work
但是,对
create\u tree
的调用并没有生成我所期望的树

> base_tree

{:sha=>"2c89f29eab56c8f53bcbb5649bb326433e439629",
 :url=>"https://api.github.com/repos/dudo/k8s_colors/git/trees/2c89f29eab56c8f53bcbb5649bb326433e439629",
 :tree=>
  [{:path=>".gitignore", :mode=>"100644", :type=>"blob", :sha=>"f494b1b6ae2590ef5998845626566708ec9e2908", :size=>15, :url=>"https://api.github.com/repos/dudo/k8s_colors/git/blobs/f494b1b6ae2590ef5998845626566708ec9e2908"},
   {:path=>"blue", :mode=>"040000", :type=>"tree", :sha=>"ac10637c3435b466ef29ddc5c0f40f047f1b7e92", :url=>"https://api.github.com/repos/dudo/k8s_colors/git/trees/ac10637c3435b466ef29ddc5c0f40f047f1b7e92"},
   {:path=>"blue/base", :mode=>"040000", :type=>"tree", :sha=>"4996aaefbf8099595515907a8e80dd266638afcc", :url=>"https://api.github.com/repos/dudo/k8s_colors/git/trees/4996aaefbf8099595515907a8e80dd266638afcc"},
   {:path=>"blue/base/deployment.yaml", :mode=>"100644", :type=>"blob", :sha=>"770bdc76ea5a29ba7e5219cd9cedfa7333adb084", :size=>512, :url=>"https://api.github.com/repos/dudo/k8s_colors/git/blobs/770bdc76ea5a29ba7e5219cd9cedfa7333adb084"},
   {:path=>"blue/base/ingress.yaml", :mode=>"100644", :type=>"blob", :sha=>"f2e9e9babb19978ec3dc3e10e71a2b3cbd80840f", :size=>292, :url=>"https://api.github.com/repos/dudo/k8s_colors/git/blobs/f2e9e9babb19978ec3dc3e10e71a2b3cbd80840f"},
   {:path=>"blue/base/service.yaml", :mode=>"100644", :type=>"blob", :sha=>"80a9ccdb3a395395b58fa462b2b4d0339665862e", :size=>122, :url=>"https://api.github.com/repos/dudo/k8s_colors/git/blobs/80a9ccdb3a395395b58fa462b2b4d0339665862e"},
   {:path=>"blue/overlays", :mode=>"040000", :type=>"tree", :sha=>"34e882c2a2b76ef926bfe179aaba688e2956ff12", :url=>"https://api.github.com/repos/dudo/k8s_colors/git/trees/34e882c2a2b76ef926bfe179aaba688e2956ff12"},
   {:path=>"blue/overlays/foo", :mode=>"040000", :type=>"tree", :sha=>"aa9a92503f622aa6d61c74a63dda655a3afe0bf8", :url=>"https://api.github.com/repos/dudo/k8s_colors/git/trees/aa9a92503f622aa6d61c74a63dda655a3afe0bf8"},
   {:path=>"blue/overlays/foo/ingress.yaml", :mode=>"100644", :type=>"blob", :sha=>"2245b69ea811665de2bea620db394d69fe41f768", :size=>311, :url=>"https://api.github.com/repos/dudo/k8s_colors/git/blobs/2245b69ea811665de2bea620db394d69fe41f768"},
   {:path=>"blue/overlays/foo/service.yaml", :mode=>"100644", :type=>"blob", :sha=>"af1742cdd917b7207377874ba34263a782fce673", :size=>147, :url=>"https://api.github.com/repos/dudo/k8s_colors/git/blobs/af1742cdd917b7207377874ba34263a782fce673"},
   {:path=>"red", :mode=>"040000", :type=>"tree", :sha=>"a8442ac6ab5be147f5452aa4a94061b81b0dc32b", :url=>"https://api.github.com/repos/dudo/k8s_colors/git/trees/a8442ac6ab5be147f5452aa4a94061b81b0dc32b"},
   {:path=>"red/base", :mode=>"040000", :type=>"tree", :sha=>"9374bbaec9f3ca88bfc4dcbdee421d8edecd9d73", :url=>"https://api.github.com/repos/dudo/k8s_colors/git/trees/9374bbaec9f3ca88bfc4dcbdee421d8edecd9d73"},
   {:path=>"red/base/deployment.yaml", :mode=>"100644", :type=>"blob", :sha=>"3a8d2448475d851e851dff1fc36d1bb443c8acea", :size=>507, :url=>"https://api.github.com/repos/dudo/k8s_colors/git/blobs/3a8d2448475d851e851dff1fc36d1bb443c8acea"},
   {:path=>"red/base/ingress.yaml", :mode=>"100644", :type=>"blob", :sha=>"b9322cc79212813285b93467e15aa5aea08eb442", :size=>289, :url=>"https://api.github.com/repos/dudo/k8s_colors/git/blobs/b9322cc79212813285b93467e15aa5aea08eb442"},
   {:path=>"red/base/service.yaml", :mode=>"100644", :type=>"blob", :sha=>"5113689b6a1c1aca2b36a3c513d9c143e8ae12e0", :size=>120, :url=>"https://api.github.com/repos/dudo/k8s_colors/git/blobs/5113689b6a1c1aca2b36a3c513d9c143e8ae12e0"},
   {:path=>"red/overlays", :mode=>"040000", :type=>"tree", :sha=>"a4f8d5b81643b26684f7db7af17bf5d2d95c3c1b", :url=>"https://api.github.com/repos/dudo/k8s_colors/git/trees/a4f8d5b81643b26684f7db7af17bf5d2d95c3c1b"},
   {:path=>"red/overlays/foo", :mode=>"040000", :type=>"tree", :sha=>"bccf70cc1e84f1724116644ee8c82cf4ab734834", :url=>"https://api.github.com/repos/dudo/k8s_colors/git/trees/bccf70cc1e84f1724116644ee8c82cf4ab734834"},
   {:path=>"red/overlays/foo/deployment.yaml", :mode=>"100644", :type=>"blob", :sha=>"3e050646dd49721b3d701929c0a89db831ebea14", :size=>524, :url=>"https://api.github.com/repos/dudo/k8s_colors/git/blobs/3e050646dd49721b3d701929c0a89db831ebea14"},
   {:path=>"red/overlays/foo/ingress.yaml", :mode=>"100644", :type=>"blob", :sha=>"840d45bb3c5c6c81a1ac71d82ee49d348653ffc7", :size=>308, :url=>"https://api.github.com/repos/dudo/k8s_colors/git/blobs/840d45bb3c5c6c81a1ac71d82ee49d348653ffc7"},
   {:path=>"red/overlays/foo/namespace.yaml", :mode=>"100644", :type=>"blob", :sha=>"9eb7d29d67093ec524dcea1b32f3eeb7c2cecc81", :size=>57, :url=>"https://api.github.com/repos/dudo/k8s_colors/git/blobs/9eb7d29d67093ec524dcea1b32f3eeb7c2cecc81"},
   {:path=>"red/overlays/foo/service.yaml", :mode=>"100644", :type=>"blob", :sha=>"43d2053a6f237d643036499fa7b01d7b01fc2111", :size=>142, :url=>"https://api.github.com/repos/dudo/k8s_colors/git/blobs/43d2053a6f237d643036499fa7b01d7b01fc2111"}],
 :truncated=>false}


> clean_tree

[
  {:path=>".gitignore", :mode=>"100644", :type=>"blob", :sha=>"f494b1b6ae2590ef5998845626566708ec9e2908"}, 
  {:path=>"blue/base/deployment.yaml", :mode=>"100644", :type=>"blob", :sha=>"770bdc76ea5a29ba7e5219cd9cedfa7333adb084"}, 
  {:path=>"blue/base/ingress.yaml", :mode=>"100644", :type=>"blob", :sha=>"f2e9e9babb19978ec3dc3e10e71a2b3cbd80840f"}, 
  {:path=>"blue/base/service.yaml", :mode=>"100644", :type=>"blob", :sha=>"80a9ccdb3a395395b58fa462b2b4d0339665862e"}, 
  {:path=>"red/base/deployment.yaml", :mode=>"100644", :type=>"blob", :sha=>"3a8d2448475d851e851dff1fc36d1bb443c8acea"}, 
  {:path=>"red/base/ingress.yaml", :mode=>"100644", :type=>"blob", :sha=>"b9322cc79212813285b93467e15aa5aea08eb442"}, 
  {:path=>"red/base/service.yaml", :mode=>"100644", :type=>"blob", :sha=>"5113689b6a1c1aca2b36a3c513d9c143e8ae12e0"}
]


> client.create_tree(repo, clean_tree)

{:sha=>"2a8800e18b5a4dc50414fc380e2d2d66401082d3",
 :url=>"https://api.github.com/repos/dudo/k8s_colors/git/trees/2a8800e18b5a4dc50414fc380e2d2d66401082d3",
 :tree=>
  [{:path=>"blue", :mode=>"040000", :type=>"tree", :sha=>"d0554827144fae7e578edb545d07e8e43bd17b74", :url=>"https://api.github.com/repos/dudo/k8s_colors/git/trees/d0554827144fae7e578edb545d07e8e43bd17b74"},
   {:path=>"red", :mode=>"040000", :type=>"tree", :sha=>"f2d7ff860c04b80fb4f9b6cba5304d0ca0a6816f", :url=>"https://api.github.com/repos/dudo/k8s_colors/git/trees/f2d7ff860c04b80fb4f9b6cba5304d0ca0a6816f"}],
 :truncated=>false}
1) 您可以从回购协议的最后一笔中获得
sha

sha_base_tree = client.commit(repo, sha_latest_commit).commit.tree.sha
2) 你把所有的钱都拿来

3) 您可以循环并修改这些
三个

cleaned_tree = base_tree.tree.reject { |blob| blob.path.include? ['overlays', namespace].join('/') }
sanitized_tree = cleaned_tree.map { |o| o.to_h.slice(:path, :mode, :type, :sha) }
sha_new_tree = client.create_tree(repo, sanitized_tree)
4) 您需要在中输入回购的正确路径

我试着通过你的手机取回你的树。,这意味着您没有创建任何树。回购协议甚至不存在

另外
.create_tree
返回以下
head
提交

  • 2A8800E18B5A4DC5044FC380E2D2D66401082D3
  • 蓝色
    d0554827144fae7e578edb545d07e8e43bd17b74
  • 红色
    F2D7FF860C04B80FB4F9B6CBA5304D0CA06816F

  • 为了进一步提供帮助,我们需要查看github上的所有树,这些树来自base,以及那些源自净化树的树,并检查这些提交。我将在历史记录中验证这些提交是否不存在。

    我传递的
    sanitized_树
    参数在最后一个代码片段中表示,这也解释了相关文本。经过消毒的_树看起来不错,但在创建新的树时,我希望仍然存在的树和斑点都消失了。我用
    经过消毒的_树更新了我的问题,以显示我的意思。@Dudo我更新了我的答案,我相信你使用了错误的路径进行回购,因为我的输入错误(在问题中,由于该变量是通过
    ruby-feature\u cleanup.rb-n foo-r dudo/k8s\u colors
    传入的)。此外,repo是私有的。更新了问题以显示
    base\u tree
    。我还重命名了一个变量。我现在只有
    clean\u tree
    cleaned_tree = base_tree.tree.reject { |blob| blob.path.include? ['overlays', namespace].join('/') }
    sanitized_tree = cleaned_tree.map { |o| o.to_h.slice(:path, :mode, :type, :sha) }
    sha_new_tree = client.create_tree(repo, sanitized_tree)
    
    client.create_tree('dudo/k8s_colors', sanitized_tree)