如何将GitHub问题导出到Excel?

91
我如何将企业版GitHub存储库的所有问题导出到Excel文件中? 我尝试搜索了许多Stack Overflow答案,但没有成功。我也尝试过这个解决方案(将Git问题导出为CSV),但是遇到了“ImportError:找不到名称为requests的模块”错误。是否有任何工具或任何简单的方法可以将所有问题导出到Excel中?

您需要使用API来迭代每个要导出数据的存储库。我建议使用ruby octokit作为与GitHub快速交互的方法。如果您无法添加更多代码或详细信息,请注意此问题可能会被投票降低。 - osowskit
15个回答

65
使用官方的GitHub CLI工具,您可以轻松地将所有问题导出为CSV格式。
brew install gh

登录:

gh auth login

切换到存储库目录并运行以下命令:

gh issue list --limit 1000 --state all | tr '\t' ',' > issues.csv

在欧洲的.csv文件中,分隔符是分号';',而不是逗号。您可以根据需要修改分隔符。

2
这对我很有帮助,尽管默认的csv使用逗号分隔符,但将输出发送到文件gh issue list --limit 1000 --state all | tr '\t' ',' > my_issues.csv的用法非常有用。 - Rob
2
谢谢。还不错!注意:对我来说,在MacOS上正确地在Excel中打开CSV,我将脚本行中的“,”替换为“;”。 - jeff_drumgod
2
谢谢。gh改变了我的生活。MAX_NUM=`gh issue list --limit 1 --json number | jq ".[].number"`; for n in `seq 1 $MAX_NUM`; do gh issue view $n --json assignees,author,body,closed,closedAt,comments,createdAt,id,labels,milestone,number,projectCards,reactionGroups,state,title,updatedAt,url >> github-dump.json; done - John Lehmann
1
谢谢;我在美国使用Excel...我用以下命令得到了一个更干净的csv文件:gh issue list --limit 1000 --state all | tr ',' ' ' | tr '\t' ',' > issues.csv - C C
@trejder 不,它将命令输出重定向到issues.cv,看看最后这部分:> issues.csv - undefined
显示剩余4条评论

63

要使用curl从私有仓库导出,您可以运行以下命令:

curl -i https://api.github.com/repos/<repo-owner>/<repo-name>/issues --header "Authorization: token <token>" 

可以在个人访问令牌下生成该令牌。

查看API说明获取所有细节信息。


14
https://api.github.com/repos/<repo-owner>/<repo-name>/issues?state=all会获取到所有问题。请注意,拉取请求也被视为问题,因此您也会得到它们。所有查询参数在这里 - mbesso
2
为什么要使用-i标志?不使用该标志输出的JSON会更好吗? - mwag
1
密码认证即将被弃用:https://developer.github.com/changes/2020-02-14-deprecating-password-auth/ - Eric Stdlib
2
如果您已经设置了双重身份验证,那么在执行此操作时是否会遇到任何问题? - Stephane Grenier
6
如前所述,这已经被弃用了,如果您启用了双重身份验证,它不起作用。正确的方法是在 https://github.com/settings/tokens 创建一个个人访问令牌,然后将该值作为头部传递:curl -i https://api.github.com/repos/<repo-owner>/<repo-name>/issues --header "Authorization: token <token>" - tom-james-watson
显示剩余3条评论

38
hub 命令行包装器使 GitHub 操作变得非常简单。
你可以像这样做:
$ hub issue -f "%t,%l%n" > list.csv

这将为您提供类似于以下内容的东西。
$ more issue.csv

Issue 1 title, tag1 tag2
Issue 2 title, tag3 tag2
Issue 3 title, tag1

9
这绝对是我从这些答案中试过的最好的方法。为了让你了解其强大之处,以下命令 hub issue -s all -d 2019-08-20 -o updated --include-pulls -f "%U|%t|%S|%cI|%uI|%L%n" > issues.csv 导出了所有自 2019 年 8 月 20 日更新的问题,包括拉取请求,并将它们作为分隔符为 "|" 的 csv 输出。 - Richard J
3
同意这是一个很好的方法。起初我不是很清楚的是: 1)在包含克隆感兴趣的仓库的文件夹内运行命令。 2)第一次运行hub时,不要将其重定向到 list.csv,因为它可能会要求输入用户名和密码,看起来会卡住。 - Nick Ager
2
如果您想获取每个问题的所有评论并保留格式,而不是CSV:hub issue -s all -f“%I%n”| xargs -I%sh -c'hub issue show%| dos2unix>%.md'。这将为每个问题生成一个Markdown文件。dos2unix清理导出中的换行符。 - Christian Long
hub 看起来是一个不错的解决方案,但需要注意文档中指出它要求使用 https 协议而非 ssh。同时它只能在 Mac 上使用。 - truedat101
@truedat101 - github repo上的文档提供了Windows安装和使用SSH的说明。 - chip
这是不推荐使用的,请使用这个答案https://stackoverflow.com/a/64299751/2268997。 - undefined

17
如果这是一次性任务,您可以尝试使用GitHub WebAPI进行操作。它允许以JSON格式导出问题。然后您可以将其转换为Excel(例如使用一些在线转换器)。
只需在浏览器中打开以下URL,将{owner}{repo}替换为实际值即可:

https://api.github.com/repos/{owner}/{repo}/issues?page=1&per_page=100


10
尝试这样做,仅适用于公共存储库(对于私有存储库会出现“未找到”错误)。 它也不包括评论,但会告诉你有多少评论。 - Jason
1
@Jason,你有没有找到任何方法来下载评论和它们的附件? - Nicolas
1
@NicolasMaltais,评论也可以通过API获得,因此会有一个端点(详见https://developer.github.com/v3/issues/comments/)。附件都使用Markdown标记引用,因此您需要解析这些标记以获取附件的URL,并单独下载它们。如果您正在其他地方重建问题和评论,则可能需要修改这些URL以指向您的新附件存储位置。 - Jason

8

很遗憾,github.com没有让这个过程变得更容易。

同时,如果你有jq和curl,你可以使用类似以下示例的两行代码来输出问题编号、标题和标签,并且它也适用于私有仓库(如果你不想按标签筛选,只需删除url中的labels={label}&部分)。你需要替换$owner、$repo、$label和$username:

# with personal access token = $PAT
echo "number, title, labels" > issues.csv
curl "https://api.github.com/repos/$owner/$repo/issues?labels=$label&page=1&per_page=100" -u "$username:$PAT" \
| jq -r '.[] | [.number, .title, (.labels|map(.name)|join("/"))]|@csv' >> issues.csv

# without PAT (will be prompted for password)
echo "number, title, labels" > issues.csv
curl "https://api.github.com/repos/$owner/$repo/issues?labels=$label&page=1&per_page=100" -u "$username" \
| jq -r '.[] | [.number, .title, (.labels|map(.name)|join("/"))]|@csv' >> issues.csv

请注意,如果您的数据超过1页,可能需要进行额外的调用。

要添加您的 OTP,只需将以下标头添加到 curl 请求中:-H "GitHub-OTP: XXXXXX" - Adam Reis
这个命令可否扩展到获取每个问题的主体内容? - Camille Goudeseune
刚刚我尝试了一下,github 给我发了邮件:您最近使用密码通过 curl/7.35.0 访问 GitHub API 的一个端点。我们将很快停用使用密码的基本身份验证: ... 我们建议使用具有适当范围的个人访问令牌(PAT)来代替使用密码访问此端点。请访问 https://github.com/settings/tokens 了解更多信息。 - Camille Goudeseune
1
谢谢!我已经更新了答案,同时提供了使用PAT时的语法。 - mwag
1
@CamilleGoudeseune,假设您说的“body”是指与问题相关的评论,为了获取这些评论,指令必须进一步扩展,以便每个条目都对Github API进行额外的调用,以获取每个问题的评论,例如https://developer.github.com/v3/issues/comments/#list-comments-on-an-issue中所描述的那样。 - mwag

4

你也可以查看我创建的一行代码(它涉及到 GitHub CLI 和 jq

gh issue list --limit 10000 --state all --json number,title,assignees,state,url | jq  -r '["number","title","assignees","state","url"], (.[] | [.number, .title, (.assignees | if .|length==0 then "Unassigned" elif .|length>1 then map(.login)|join(",") else .[].login end) , .state, .url]) | @tsv' > issues-$(date '+%Y-%m-%d').tsv

文档的Gist


尽管此链接可能回答了问题,但最好在此处包含答案的基本部分并提供参考链接。如果链接页面更改,则仅有链接的答案可能会失效。- 【来自审核】 - Tobias S.
gh GitHub CLI 现在与 jq 集成,可以使用 --jq <expression> 通过 jq 表达式过滤 JSON 输出。详细信息请参阅 GitHub CLI 手册 https://cli.github.com/manual/gh_issue_list。 - JV conseil

4

我尝试了其他评论中描述的将问题以JSON格式导出的方法。虽然它可以正常工作,但格式有些混乱。后来我在Excel帮助中发现它能够直接访问API并将数据从JSON响应中整洁地加载到我的Excel表格中。

我用于找到所需帮助的Google术语是“excel power query web.content GET json”。我找到了一段非常有帮助的How To Excel视频。

在Excel查询中有效的URL(与其他帖子相同):

https://api.github.com/repos/{owner}/{repo}/issues?page=1&per_page=100

个人而言,我也会添加参数&state=open,否则我需要请求数百页。曾经有一次,我达到了GitHub对于我的IP地址未认证API调用/小时的限制。


2

2
你也可以尝试使用 https://github.com/remoteorigin/git-issues-downloader,但请确保使用开发分支。npm版本和主分支存在错误。
或者,你可以使用这个修补过的版本。
npm install -g https://github.com/mkobar/git-issues-downloader

然后使用(用于公共存储库)运行

git-issues-downloader -n -p none -u none https://github.com/<user>/<repository>

或者对于私有仓库:

git-issues-downloader -n -p <password or token> -u <user> https://github.com/<user>/<repository>

运行良好。


截至2020年2月,不支持2FA :( - Anastasios Andronidis

2

我已经花了相当长的时间来摸索这个问题,发现Power BI是一种很好的方法来保持电子表格中的数据更新。我必须稍微研究一下Power BI才能使其正常工作,因为从结构化JSON字段中获取正确的信息,并将列表折叠成连接字符串,特别是对于标签,这并不是非常直观的。但是,这个Power BI查询对我来说很有效,它能够消除所有噪音,并将相关信息以易于消化的格式呈现,可以与利益相关者进行审查:

let
    MyJsonRecord = Json.Document(Web.Contents("https://api.github.com/repos/<your org>/<your repo>/issues?&per_page=100&page=1&state=open&filter=all", [Headers=[Authorization="Basic <your auth token>", Accept="application/vnd.github.symmetra-preview+json"]])),
    MyJsonTable = Table.FromRecords(MyJsonRecord),
    #"Column selection" = Table.SelectColumns(MyJsonTable,{"number", "title", "user", "labels", "state", "assignee", "assignees", "comments", "created_at", "updated_at", "closed_at", "body"}),
    #"Expanded labels" = Table.ExpandListColumn(#"Column selection", "labels"),
    #"Expanded labels1" = Table.ExpandRecordColumn(#"Expanded labels", "labels", {"name"}, {"labels.name"}),
    #"Grouped Rows" = Table.Group(#"Expanded labels1", {"number","title", "user", "state", "assignee", "assignees", "comments", "created_at", "updated_at", "closed_at", "body"}, {{"Label", each Text.Combine([labels.name],","), type text}}),
    #"Removed Other Columns" = Table.SelectColumns(#"Grouped Rows",{"number", "title", "state", "assignee", "comments", "created_at", "updated_at", "closed_at", "body", "Label"}),
    #"Expanded assignee" = Table.ExpandRecordColumn(#"Removed Other Columns", "assignee", {"login"}, {"assignee.login"})
in
    #"Expanded assignee"

在这个查询中,我添加了然后删除了一些列,没有清理干净 - 在使用之前请随意进行清理。显然,您还需要将自己的组织名称和存储库名称填入URL中,并获取授权令牌。我已经使用Chrome REST插件测试了该URL,并从那里输入用户和API密钥获取了令牌。如果您不想处理令牌,则可以使用用户和密钥明确进行身份验证。我只是觉得在查询设置中走匿名路线并提供已格式化的请求头更简单。

此外,这适用于具有最多100个未解决问题的存储库。如果您拥有更多,则需要复制查询(第2页等)并合并结果。

使用此查询的步骤:

  • 在新工作表上,“数据”选项卡中,打开“获取数据”下拉菜单
  • 选择“启动Power Query Editor”
  • 在编辑器中,选择“新查询”,“其他来源”,“空白查询”
  • 现在,您单击“高级编辑器”,然后粘贴上面的查询
  • 在高级编辑器上单击“完成”按钮,然后从工具栏中单击“关闭并加载”
  • 问题正在加载到您的电子表格中,您已经开始工作了
  • 不需要糟糕的第三方工具

我无法使用授权头使其工作,但是将该头部删除并将我的用户名和PAT令牌放入“基本”部分的数据源设置>编辑权限>访问Web内容对话框中可以实现。 - Daz
1
Github文档中的标准接受头现在是"application/vnd.github.v3+json"。 - Daz
尝试了许多方法后,这是唯一一个表现良好的方法。我不得不将“Basic <your auth token>”切换为“Token <your auth token>”,才能使其正常工作。非常感谢您的分享。 - Robin Wilson
尝试了很多方法后,这是唯一一个效果很好的。我不得不将“Basic <your auth token>”切换为“Token <your auth token>”,才让它起作用。非常感谢你的分享。 - undefined
为了将日期格式化为Excel可以识别的日期/时间格式,您可以添加以下行 #"Changed Type" = Table.TransformColumnTypes(#"Expanded assignee",{{"created_at", type datetime}, {"updated_at", type datetime}, {"closed_at", type datetime}}) - Robin Wilson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接