使用bash将文件上传到Gist

30
我通常会在Github的Gist上粘贴错误报告和日志,以交换有关编程调试信息。Gist没有上传文件的按钮。因此,有时将大型错误报告复制并粘贴到gist文本区域中并不那么方便。
是否有一种方式可以从命令行上传文件到您的Gist账户中的新Gist?
同时,为要上传的文件创建一个临时git存储库也会有所帮助,然后我可以在脚本中自动化这个过程。
最终,我希望通过一个bash脚本自动发布我的编程项目的调试信息到Github。

1
这不是一个编程问题,你链接的页面上还有一个写着“添加文件”的按钮。 - Dr.Avalanche
5
这是一个编程问题,因为gist是程序员使用最广泛的平台。此外,页面上有一个“添加文件”的按钮,但它并不会上传文件,而是打开另一个文本区域以粘贴另一个文件。 - rubo77
我澄清了我的问题目的,请重新考虑你们的投票。 - rubo77
你能不能不用pastebinit上传到gist?https://bugs.launchpad.net/pastebinit/+bug/268287 - Thufir
7个回答

15

这里是一个适用于Bash/Dash的解决方案,可以创建匿名的Gist(很可能不是百分之百可靠):

# 0. Your file name
FNAME=some.file

# 1. Somehow sanitize the file content
#    Remove \r (from Windows end-of-lines),
#    Replace tabs by \t
#    Replace " by \"
#    Replace EOL by \n
CONTENT=$(sed -e 's/\r//' -e's/\t/\\t/g' -e 's/"/\\"/g' "${FNAME}" | awk '{ printf($0 "\\n") }')

# 2. Build the JSON request
read -r -d '' DESC <<EOF
{
  "description": "some description",
  "public": true,
  "files": {
    "${FNAME}": {
      "content": "${CONTENT}"
    }
  }
}
EOF

# 3. Use curl to send a POST request
curl -X POST -d "${DESC}" "https://api.github.com/gists"

如果您需要创建与您的Github账户相关联的gist(用于基本身份验证),请将最后一行替换为:
curl -u "${GITHUB_USERNAME}" -X POST -d "${DESC}" "https://api.github.com/gists"

如需更高级的身份验证方案,请参阅https://developer.github.com/v3/#authentication


我做了一些增强: https://gist.github.com/rubo77/3b8b15f4df5b5287a24f87523c41e4ce - rubo77
有一个问题:如果上传的文件包含%字符,似乎会在那一点上出现问题:我尝试上传一个包含以下内容的文件:UNIX_TIMESTAMP=$(date +%s%3N --date='TZ="UTC+2" '"$TIME") - rubo77
@rubo77 很有趣。现在,我看不出为什么“%”会有特殊的含义。我不知道我是否有时间去调查这个问题。如果你有更多的想法,请让我知道! - Sylvain Leroux
2
你为什么要用gist呢?我们使用一个可以跟踪问题的repo继续:https://github.com/ceremcem/create-gist - ceremcem
为了节省大家的时间,直接访问 https://dev59.com/eV8d5IYBdhLWcg3wv0Ug#68461779 ,该链接提供了官方的 Github CLI 使用方法。 - alvas
显示剩余2条评论

11

1
在Ubuntu上:apt install gist会安装这个宝石。如果您喜欢,也可以使用Ruby进行安装。它像宝石一样工作 :) - Thufir

7

使用 GitHub CLI 工具:

gh gist create yourfile

或者,对于公开的gist,
gh gist create --public yourfile

要添加描述,请使用--desc/-d标志,要直接在Web浏览器中打开,请使用--web/-w

请参阅GitHub CLI的手册查看gh gist create的参考手册。


我喜欢这个,这是一个更新的答案 :) - Adi Prasetyo

5

在Sylvain Leroux的回答基础上,我们可以使用命令行工具jq来替换清理和json构建步骤:

$ jq -Rs '{"description": "some description", "public": true, "files": {"'$FNAME'": {"content": .}}}' $FNAME | curl -X POST -d @- "https://api.github.com/gists"

或者,使用身份验证:
$ jq -Rs '{"description": "some description", "public": true, "files": {"'$FNAME'": {"content": .}}}' $FNAME | curl -u "${GITHUB_USERNAME}" -X POST -d @- "https://api.github.com/gists"

3

1
不错 ;) 但这并没有解释如何使用bash来实现,这可能吗? - rubo77
1
@rubo77 是的:使用我提到的curl版本。它是一个bash命令。 - VonC

2
这里有一个Python脚本(链接)可以实现相同的功能,由我积极开发维护。README很简单明了,介绍了使用方法。
一些示例:

获取gist列表

gifc get 5

创建gist

  • 从像nanovimgedit这样的编辑器中进行交互式创建
    • gifc create create.md -d "如何从cli创建gist" -i nano
  • 直接从cli输入内容
    • gifc create create.md -d "如何从cli创建gist" -m '''如果您想从现有文件创建gist,则执行以下操作- `gifc create create.md -d "如何从cli创建gist" -f file.md`'''
  • 从文件中获取内容
    • gifc create create.md -d "如何从cli创建gist" -f file.md

更新gist

  • 迭代地编辑所有(或一些)文件

    • gifc update ffd2f4a482684f56bf33c8726cc6ae63 -i vi
      您可以从先前的get方法中获取gist id
  • 更改描述

    • gifc update ffd2f4a482684f56bf33c8726cc6ae63 -cd "新描述"
      您可以从先前的get方法中获取gist id
  • 在像nanovimgedit这样的编辑器中交互式地编辑文件内容

    • gifc update ffd2f4a482684f56bf33c8726cc6ae63 -f file_to_update.md
  • 两者都要做
    • gifc update ffd2f4a482684f56bf33c8726cc6ae63 -f file_to_update.md -cd "新描述"

从gist中删除文件

gifc remove ffd2f4a482684f56bf33c8726cc6ae63 -r file1.md script.py readme.txt
您可以从之前的get方法中获取gist id

删除整个gist

gifc delete ffd2f4a482684f56bf33c8726cc6ae63
您可以从之前的get方法中获取gist id


0

对于具有受限制的busybox ash shells路由器,我创建了这个shell脚本post和patch gister。用法:$ pgist my_file_to_post_or_patch_to_gist.extension

无需记住长长的gist ID。这个gister被编码为自动查找相应的gist ID。限制如下:

  1. 您的帐户中最多有30(可能是100)个gists
  2. 每个gist最多有300个文件
  3. 所有30×300 gist文件都需要唯一的文件名
  4. 由于“解析JSON问题”,它无法自行发布/修补

安装示例

curl -O https://gist.githubusercontent.com/ProBackup-nl/3971a45b21749cfff6c0069d3dad1dde/raw/pgist.sh && chmod 755 pgist.sh && mv pgist.sh /opt/usr/sbin/pgist

依赖项

  • Github OAuth Token
  • jq
  • sed
  • awk
  • curlca-certificates用于创建有效的证书链,而不是

(60) SSL证书问题:无法获取本地颁发者证书


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