使用Trees API将git树从一个Github repo复制到另一个

时间:2017-07-10 23:20:15

标签: git github tree

说我有两个回购,repo1repo2

让我们说repo1具有以下目录结构:

repo1
|--someFolder
   |-- file1.txt
   |-- file2.jpg

让我们说repo2是空的。我的目标是使用GitHub Trees API将所有someFolder复制到repo2。但是我遇到了以下问题:

  1. 当我在带有以下参数的网址https://api.github.com/repos/my-username/repo2/git/trees的HTTP POST请求中使用以下参数时

    {'base_tree': repo2_base_tree_sha, 'tree': [ //Specially formatted tree from repo1 {'mode': u'100644', 'path': u'.travis.yml', 'sha': u'559d004c3af59b3bd8dcc486d5d2b5f91ab4f85d', 'type': u'blob'}, {'mode': u'100644', 'path': u'README.md', 'sha': u'11e4f5fa0b929ff6bccd8f5bcd99cbdbd845d69a', 'type': u'blob'} ] } 我收到422回复,上面写着一条消息 tree.sha 559d004c3af59b3bd8dcc486d5d2b5f91ab4f85d is not a valid blob。这让我相信不能简单地使用来自repo2的树为repo1构建一个新树,那么如何从另一个存储库中获取树并将其添加到另一个存储库?

  2. 其次,我可以使用上述相同的参数成功修改repo1基础树,但base_treerepo1的base_tree SHA除外。但是,当我访问repo1时,这些更改未得到反映,不确定原因。

2 个答案:

答案 0 :(得分:1)

我已经能够确定2.我自己的答案。

创建新树不会自动更新github页面的原因是因为github上的最新提交未指向我们新创建的树。我们必须通过创建指向新树的提交来解决此问题。

目前正在开展工作。

---更新7/12/17 ---

我也确定了1号的答案。 对于上面'tree'列表中的每个字典,只有在字典表示的文件已提交到目标存储库时才应包含'sha'字段,否则您需要'content'字典中存储文件所代表内容的字段。

答案 1 :(得分:0)

我刚刚发现了另一种最简单的方法。 git提供了一个API:

https://docs.github.com/en/rest/reference/repos#create-a-repository-using-a-template

这将允许您通过处理模板存储库中的整个文件夹内容来创建具有新名称的新存储库。

如果您需要直接从 GitHub UI 执行此操作,请选中模板存储库复选框。 checking Template Repository checkbox